Tsql 查询以查找所有FK约束及其引用的表列
我有一个大型SQL 2012数据库(100个表),我需要在其中查找引用操作设置为级联(更新或删除)的所有约束 在中,我可以使用以下T-SQL列出约束(稍作修改): 这提供了一个有用的列表: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
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;