一个SQL脚本以识别所有引用表的外键
一个SQL脚本以识别所有引用表的外键
我需要在SQL Server数据库中删除一个高度引用的表。我如何获取需要删除的所有外键约束的列表以便删除该表?
(SQL答案优先于在管理工具的GUI中单击.)
admin 更改状态以发布 2023年5月23日
这将给您以下内容:
- 外键本身
- 外键所属模式
- “引用表”或具有FK的表
- “引用列”或引用表中指向FK的列
- “引用表”或具有FK指向的键列的表
- “引用列”或FK指向的键列
以下是代码:
SELECT obj.name AS FK_NAME, sch.name AS [schema_name], tab1.name AS [table], col1.name AS [column], tab2.name AS [referenced_table], col2.name AS [referenced_column] FROM sys.foreign_key_columns fkc INNER JOIN sys.objects obj ON obj.object_id = fkc.constraint_object_id INNER JOIN sys.tables tab1 ON tab1.object_id = fkc.parent_object_id INNER JOIN sys.schemas sch ON tab1.schema_id = sch.schema_id INNER JOIN sys.columns col1 ON col1.column_id = parent_column_id AND col1.object_id = tab1.object_id INNER JOIN sys.tables tab2 ON tab2.object_id = fkc.referenced_object_id INNER JOIN sys.columns col2 ON col2.column_id = referenced_column_id AND col2.object_id = tab2.object_id
我不确定为什么没有人建议,但我使用sp_fkeys
查询给定表的外键:
EXEC sp_fkeys 'TableName'
您也可以指定模式:
EXEC sp_fkeys @pktable_name = 'TableName', @pktable_owner = 'dbo'
不指定模式时,文档说明如下:
如果未指定pktable_owner,则底层数据库管理系统的默认表可见性规则适用。
在SQL Server中,如果当前用户拥有指定名称的表,则返回该表的列。如果未指定pktable_owner,且当前用户不拥有指定pktable_name的表,则该过程将查找由数据库所有者拥有的指定pktable_name的表。如果存在,则返回该表的列。