Oracle 查找“虚拟”外键

Oracle 查找“虚拟”外键,oracle,foreign-keys,primary-key,composite-primary-key,Oracle,Foreign Keys,Primary Key,Composite Primary Key,我正在执行基于Oracle的数据加载,一个访问数据库的应用程序正在强制执行一些虚拟外键,而数据库不会通过ALL_CONS_COLUMNS表强制执行这些虚拟外键。由于该应用程序是一个黑匣子,这意味着我无法访问规范或源代码,因此我不得不通过获取数据库中所有主键的列表来查找这些可能的键,然后查找结构中具有相同字段组合的所有表。我正试图找到一种高效、自动化的方法来实现这一点,尤其是考虑到数据库的规模巨大。有什么想法吗?这里有一些开始的想法: WITH cteIndexes AS (select ui.T

我正在执行基于Oracle的数据加载,一个访问数据库的应用程序正在强制执行一些虚拟外键,而数据库不会通过ALL_CONS_COLUMNS表强制执行这些虚拟外键。由于该应用程序是一个黑匣子,这意味着我无法访问规范或源代码,因此我不得不通过获取数据库中所有主键的列表来查找这些可能的键,然后查找结构中具有相同字段组合的所有表。我正试图找到一种高效、自动化的方法来实现这一点,尤其是考虑到数据库的规模巨大。有什么想法吗?

这里有一些开始的想法:

WITH cteIndexes AS (select ui.TABLE_NAME, ui.INDEX_NAME, ui.INDEX_TYPE, ui.UNIQUENESS,
                           ic.COLUMN_NAME, ic.COLUMN_POSITION
                      from user_indexes ui
                      INNER JOIN USER_IND_COLUMNS ic
                        ON ic.TABLE_NAME = ui.TABLE_NAME
                      WHERE ui.uniqueness = 'UNIQUE'),
     cteCandidate_keys AS (SELECT c.TABLE_NAME, c.COLUMN_NAME, c.COLUMN_ID
                             FROM cteIndexes i
                             INNER JOIN USER_TAB_COLUMNS c
                               ON c.COLUMN_NAME = i.COLUMN_NAME
                             WHERE c.TABLE_NAME <> i.TABLE_NAME
                             ORDER BY c.TABLE_NAME, c.COLUMN_ID)
SELECT 'UNIQUE KEYS' AS TABLE_NAME, NULL AS COLUMN_NAME,
       NULL AS COLUMN_POSITION, NULL AS COLUMN_ID
  FROM DUAL
UNION ALL
SELECT TABLE_NAME, COLUMN_NAME, NULL, NULL
  FROM cteIndexes
UNION ALL
SELECT NULL, NULL, NULL, NULL FROM DUAL
UNION ALL
SELECT 'CANDIDATE FOREIGN KEYS', NULL, NULL, NULL FROM DUAL
UNION ALL
SELECT TABLE_NAME, COLUMN_NAME, NULL, COLUMN_ID
  FROM cteCandidate_keys
根据需要折叠、纺锤和切割:-


可能有重复的想法吗?这不是一个有效的问题。这也表明没有研究。这也是一个常见问题。在考虑发帖之前,请始终用谷歌搜索你的错误消息或你的问题/问题/目标的许多清晰、简洁和准确的措辞,有/没有你的特定字符串/名称和网站:stackoverflow.com和标签,并阅读许多答案。如果你发布一个问题,用一句话作为标题。请参见文本上方的投票箭头(&S)。