一个SQL脚本以识别所有引用表的外键

7 浏览
0 Comments

一个SQL脚本以识别所有引用表的外键

我需要在SQL Server数据库中删除一个高度引用的表。我如何获取需要删除的所有外键约束的列表以便删除该表?

(SQL答案优先于在管理工具的GUI中单击.)

admin 更改状态以发布 2023年5月23日
0
0 Comments

这将给您以下内容:

  • 外键本身
  • 外键所属模式
  • “引用表”或具有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

0
0 Comments

我不确定为什么没有人建议,但我使用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的表。如果存在,则返回该表的列。

0