Как отследить внешние ключи? - PullRequest
0 голосов
/ 20 июня 2011

У меня есть 3 разных среды sql, которые похожи, но не одинаковы.У меня есть столбец "CLMID", используемый в разных таблицах.Большинство из них связаны с отображением внешнего ключа.Но некоторые таблицы повреждены, поэтому сопоставление внешнего ключа сделано неправильно.Теперь мне нужно обновить данные в этом столбце во всех таблицах.Поэтому мне нужен запрос, который найдет для меня список таблиц с надлежащим отображением, чтобы при обновлении родительского элемента они самостоятельно обновляли дочерний элемент.Мне также нужно найти ограничение другим способом, где, только если я обновляю дочерний элемент, я могу обновить родительскую таблицу.

Обратите внимание, что мне нужно получить этот список без каких-либо операций обновления или вставки, так как этокритическая база данных.Пожалуйста, помогите мне с запросом.Спасибо.

Ответы [ 3 ]

2 голосов
/ 20 июня 2011

Каждый продукт SQL имеет некоторый способ запрашивать базу данных для данных схемы, включая ключи.Научиться использовать Information_Schema лучше всего IMHO, потому что это стандарт для большинства платформ (насколько я помню, Oracle его не реализует).

SQL Server, вероятно, имеет несколько более простых запросов со своими собственными каталогами, но следующие несколько проблематичныезапрос дает вам именно то, что вы хотите, и является наиболее кроссплатформенным, который вы можете получить.

SELECT 
    FK.TABLE_NAME as child_table, 
    CU.COLUMN_NAME as child_column, 
    PK.TABLE_NAME  as parent_table, 
    PT.COLUMN_NAME as parent_column,
    C.CONSTRAINT_NAME 
FROM 
INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C 
INNER JOIN 
INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK 
    ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME 
INNER JOIN 
INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK 
    ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME 
INNER JOIN 
INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU 
    ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME 
INNER JOIN 
( 
    SELECT 
        i1.TABLE_NAME, i2.COLUMN_NAME 
    FROM 
        INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1 
        INNER JOIN 
        INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 
        ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME 
        WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY' 
) PT 
ON PT.TABLE_NAME = PK.TABLE_NAME 
ORDER BY 
1,2,3,4
0 голосов
/ 20 июня 2011

Проверьте sys.foreign_keys для некоторых действий, специфичных для SQL Server.В частности, кажется, что вы заинтересованы в столбцах delete_referential_action_desc и update_referential_action_desc.Насколько я знаю, нет никакой возможности обновить дочернюю таблицу, и обновление будет автоматически распространено на родительскую.Я готов поправиться, хотя.

0 голосов
/ 20 июня 2011

попробуйте

show create table table-name

Увидев это, вы можете увидеть внешние ключи, которые есть в столбцах. Это не меняет какие-либо данные таблицы

...