关于tsql:查询以查找所有FK约束及其引用的表列

Query to find all FK constraints, and their referenced table columns

我有一个大的SQL 2012数据库(100个表),其中我需要找到参照操作设置为CASCADE(更新或删除)的所有约束。

在这个有用的答案中,我看到我可以使用以下T-SQL列出约束(略微改编):

1
2
3
4
5
6
7
8
9
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';

这提供了一个有用的列表:

1
2
3
4
5
name        delete_referential_action_desc      update_referential_action_desc
----------------------------------------------------------------------
FK_name001  CASCADE                             CASCADE
FK_name002  CASCADE                             NO_ACTION
FK_name003  CASCADE                             NO_ACTION

但是,是否可以扩展代码,以便对于每个约束包括相应的表名和列名,例如?

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

我尝试过不同的编辑从sys.objects中提取值,但无法弄清楚它是如何工作的,或者这是否是正确的方法。

更新

请注意,我不想ALTER任何内容,或进行任何架构更改。 我只是想查看一个列表,以便我可以手动执行进一步的操作。 我没有信心或经验来编辑这个巨大的查询来拉出重点。


经过两天的实验,我已经非常接近我需要的终于解决了它,以这个答案为基础:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;

赞美数字神......(!)