oracle - 查找“虚拟”外键
问题描述
我正在执行基于 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
根据需要折叠、旋转和肢解。:-)
推荐阅读
- python - 获取熊猫数据框中的组大小
- javascript - 比较多个选择输入的选择输入值以检查是否选择了一个值
- php - jQuery Ajax PHP 和 CSV
- javascript - jQuery keyup 不使用 Web 方法触发
- java - 当我用 Java 中的 Scanner 类读取 .txt 文件时,如何只读取字符串或整数
- kubernetes - 如何控制边车向 Istio Mixer 报告哪些数据?
- facebook - Facebook Graph API 从评论插件中获取评论
- java - Android的Firestore超时
- batch-file - 批处理文件分配驱动器号
- java - CQRS/ES - 处理投影错误