查询以找到所有外键约束以及它们所引用的表列。
查询以找到所有外键约束以及它们所引用的表列。
我有一个大型的SQL 2012数据库(100个表),我需要找到所有参照动作设置为级联(更新或删除)的约束。
在这个有用的答案中,我看到可以使用以下稍微调整过的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
中提取值,但无法弄清楚它是如何工作的,或者是否是正确的方法。
更新
请注意,我不想进行任何ALTER
操作或进行任何模式更改。我只是想查看一个列表,以便我可以手动执行进一步的操作。我没有信心或经验编辑这个庞大的查询以提取重要的信息。
近两天的尝试后,我终于找到了我需要的内容,使用这个答案作为基础:
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;
感谢数码神灵...(!)
感谢你花费时间去找到正确的解决方法。由于新的时间表可能没有ON UPDATE CASCADE或DELETE,我必须在我的大型数据库中找到这些问题。非常有用!!