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 |
我尝试过不同的编辑从
更新
请注意,我不想
经过两天的实验,我已经非常接近我需要的 s>终于解决了它,以这个答案为基础:
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; |
赞美数字神......(!)