查找“虚拟”外键

问题描述 投票:0回答:1

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

oracle foreign-keys primary-key composite-primary-key
1个回答
0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.