Поиск «виртуальных» иностранных ключей - PullRequest
0 голосов
/ 27 сентября 2019

Я выполняю загрузку данных на основе Oracle, и приложение, которое обращается к базе данных, применяет некоторые виртуальные внешние ключи, которые база данных не применяет через таблицу ALL_CONS_COLUMNS.Поскольку приложение представляет собой черный ящик (то есть у меня нет доступа к спецификациям или исходному коду), я вынужден искать эти «возможные» ключи, получая список всех первичных ключей в БД, изатем найти все таблицы, которые имеют одинаковую комбинацию полей, присутствующих в их структуре.Я пытаюсь найти эффективный и автоматизированный способ сделать это, особенно учитывая, что база данных огромна по размеру.Есть идеи?

1 Ответ

0 голосов
/ 27 сентября 2019

Вот с чего начать:

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 здесь

...