2015-03-16 3 views
1

У меня есть большая база данных SQL 2012 (100 таблиц), в которой мне нужно найти все ограничения, в которых для ссылочного действия установлено значение CASCADE (обновление или удаление).Запрос, чтобы найти все ограничения FK и их столбцы таблицы ссылок

В this useful answer я вижу, что можно перечислить ограничения, используя следующую T-SQL (адаптировано несколько):

SELECT 
    name, 
    delete_referential_action_desc, 
    update_referential_action_desc 
FROM 
    sys.foreign_keys 
WHERE 
    update_referential_action_desc = 'CASCADE' OR 
    delete_referential_action_desc = 'CASCADE'; 

Это обеспечивает полезный список:

name  delete_referential_action_desc  update_referential_action_desc 
---------------------------------------------------------------------- 
FK_name001 CASCADE        CASCADE 
FK_name002 CASCADE        NO_ACTION 
FK_name003 CASCADE        NO_ACTION 

Тем не менее, это возможно, для расширения кода, так что для каждого ограничения включаются имена имен таблиц и столбцов, например?

name  delete_referential_action_desc  update_referential_action_desc ParentTable ParentCol ChildTable ChildCol 
---------------------------------------------------------------------------------------------------------------------------- 
FK_name001 CASCADE        CASCADE       Table1  Col1  Table2  Col2 

Я пробовал различные изменения тянущие значений из sys.objects, но не могу понять, как это работает, или является ли это даже правильный подход.

Update

Пожалуйста, обратите внимание, что я не хочу к ALTER ничего, или делать какие-либо изменения схемы. Я просто хочу просмотреть список, чтобы я мог выполнять дальнейшие действия вручную. У меня нет уверенности или опыта до edit this gigantic query, чтобы вытащить основные точки.

+0

Второй запрос в дубликата сделает это, вам просто нужно добавить предложение where, которое вы уже определили, чтобы ограничить вывод каскадными ключами. –

+0

Но я не хочу, чтобы «Alter' ничего, я просто хочу * видеть * их – EvilDr

+0

Я это понимаю. Сценарий может быть немного изменен для вывода определений без фактического их запуска. –

ответ

1

После двух дней экспериментирования Я получил довольно близко к тому, что мне нужно, наконец, решить ее, используя this answer в качестве основы: (!)

SELECT 
    C.CONSTRAINT_NAME, 
    PK.TABLE_NAME, 
    CCU.COLUMN_NAME, 
    FK.TABLE_NAME, 
    CU.COLUMN_NAME, 
    C.UPDATE_RULE, 
    C.DELETE_RULE 
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 
    INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU ON PK.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME 
WHERE 
    ((C.UPDATE_RULE = 'CASCADE') OR (C.DELETE_RULE = 'CASCADE')) AND 
    (FK.CONSTRAINT_TYPE = 'FOREIGN KEY') 
ORDER BY 
    PK.TABLE_NAME, 
    FK.TABLE_NAME; 

Хвала цифровых Богов ...