【问题标题】:Finding "Virtual" Foreign Keys查找“虚拟”外键
【发布时间】:2019-09-26 21:41:19
【问题描述】:

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

【问题讨论】:

  • “有什么想法吗?”不是一个有效的问题。这也表明没有研究。这仍然是一个常见问题解答。在考虑发布之前,请始终使用谷歌搜索您的错误消息或您的问题/问题/目标的许多清晰、简洁和精确的措辞,有或没有您的特定字符串/名称和站点:stackoverflow.com 和标签,并阅读许多答案。如果您发布问题,请使用一个短语作为标题。请参阅How to Ask 和投票箭头鼠标悬停文本。

标签: oracle foreign-keys primary-key composite-primary-key


【解决方案1】:

这里有一些东西可以开始:

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

根据需要折叠、旋转和切割。 :-)

dbfiddle here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    相关资源
    最近更新 更多