Tsql 查询以查找所有FK约束及其引用的表列

Tsql 查询以查找所有FK约束及其引用的表列,tsql,sql-server-2012,referential-integrity,Tsql,Sql Server 2012,Referential Integrity,我有一个大型SQL 2012数据库(100个表),我需要在其中查找引用操作设置为级联(更新或删除)的所有约束 在中,我可以使用以下T-SQL列出约束(稍作修改): 这提供了一个有用的列表: name delete_referential_action_desc update_referential_action_desc ---------------------------------------------------------------------- FK_na

我有一个大型SQL 2012数据库(100个表),我需要在其中查找引用操作设置为级联(更新或删除)的所有约束

在中,我可以使用以下T-SQL列出约束(稍作修改):

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

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
中提取值,但无法弄清楚它是如何工作的,或者这是否是正确的方法

更新
请注意,我不希望更改任何内容,或对架构进行任何更改。我只想查看一个列表,以便手动执行进一步的操作。我没有信心也没有经验去找出要点。

经过两天的实验,我已经非常接近我需要的东西了,最终解决了它,并以此为基础:

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;

感谢数字神…(!)

副本中的第二个查询可以做到这一点,您只需添加已标识的where子句,将输出限制为级联键。但我不想
更改任何内容,我只想看到它们我明白这一点。脚本可以稍加修改以输出定义,而无需实际运行它们。感谢您努力使其正确。由于新的时态表可能没有更新级联或删除,我不得不在我的大数据库中找到任何这样的怪物。超级有用!!
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;