如何在SQL Server中找到外键依赖项?

Eve*_*ien 163 .net sql-server foreign-keys

如何在特定列上找到所有外键依赖项?

有哪些不同的替代方案(图形化在SSMS中,SQL Server中的查询/视图,第三方数据库工具,.NET中的代码)?

Joh*_*som 285

以下查询将帮助您入门.它列出了当前数据库中的所有外键关系.

SELECT
    FK_Table = FK.TABLE_NAME,
    FK_Column = CU.COLUMN_NAME,
    PK_Table = PK.TABLE_NAME,
    PK_Column = PT.COLUMN_NAME,
    Constraint_Name = C.CONSTRAINT_NAME
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 (
            SELECT
                i1.TABLE_NAME,
                i2.COLUMN_NAME
            FROM
                INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
            INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2
                ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
            WHERE
                i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
           ) PT
    ON PT.TABLE_NAME = PK.TABLE_NAME
Run Code Online (Sandbox Code Playgroud)

您还可以在Database Diagrams中的SQL Server Management Studio中以图形方式查看关系.

  • 谢谢!我只需要添加<< WHERE FK.TABLE_NAME ='MyTable'和CU.COLUMN_NAME ='MyColumn'>>来获取特定列. (8认同)
  • @samkitshah:没人说会的.问题是标记为sql-server,根据定义是Microsoft技术.Postgres与它无关. (7认同)
  • -1:此查询错过了引用表中由唯一约束或唯一索引支持的外键,而不是主键.Per [MSDN](https://msdn.microsoft.com/en-us/library/ms189049.aspx):"外键约束不必仅链接到另一个表中的主键约束; 它也可以定义为在另一个表中引用UNIQUE约束的列."通过删除最后一个连接可以使用唯一约束来解决问题,通过删除最后两个连接可以使用唯一索引,但是这会限制信息回. (2认同)

And*_*ija 99

尝试: sp_help [table_name]

您将获得有关表的所有信息,包括所有外键

  • 很好,谢谢.但是为了寻找FK,我更喜欢Michael的答案输出:`sp_fkeys [table]` (4认同)
  • 好的,非常有用.比标记答案更难忘!我不敢相信你只能在ssms中看到它们! (2认同)

小智 39

如果您计划删除或重命名表或列,则仅查找外键依赖项可能不够.

引用未与外键连接的表 - 您还需要搜索可能未与外键连接的引用表(我看过许多设计不良的数据库没有定义外键但确实有相关数据).解决方案可能是在所有表中搜索列名并查找类似的列.

其他数据库对象 - 这可能有点偏离主题,但如果您正在寻找所有引用,那么检查依赖对象也很重要.

GUI工具 - 尝试SSMS"查找相关对象"选项或工具,如ApexSQL搜索(免费工具,集成到SSMS中),以识别所有依赖对象,包括与外键连接的表.


Mic*_*ael 39

因为您的问题是针对单个表,您可以使用:

EXEC sp_fkeys 'TableName'
Run Code Online (Sandbox Code Playgroud)

我在这里找到了它:

/sf/answers/906944391/

我很快找到了我需要的信息.它列出了外键的表,列和名称.

编辑

以下是文档的链接,其中详细说明了可以使用的不同参数:https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-fkeys-transact-sql


小智 28

我认为这个脚本比较便宜:

SELECT f.name AS ForeignKey, OBJECT_NAME(f.parent_object_id) AS TableName,
    COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
    OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
    COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc
ON f.OBJECT_ID = fc.constraint_object_id
Run Code Online (Sandbox Code Playgroud)


The*_*TXI 6

我真正喜欢使用的是Red Gate Software的 SQL Dependency Tracker .您可以放入任何数据库对象(如表,存储过程等),然后它将自动绘制依赖于所选项的所有其他对象之间的关系线.

为您的架构中的依赖项提供了非常好的图形表示.

  • 它也是向非技术人员展示他们需要花费一些资金重构数据库设计才能全部倒下的好工具.它生成的图表非常引人注目. (2认同)

Sie*_*ike 5

非常感谢约翰·桑塞姆(John Sansom),他的询问非常棒!

另外:您应该在查询末尾添加“AND PT.ORDINAL_POSITION = CU.ORDINAL_POSITION”。

如果主键中有多个字段,则此语句会将相应的字段相互匹配(我有这种情况,您的查询确实创建了所有组合,因此对于主键中的 2 个字段,我有 4 个相应外键的结果) 。

(抱歉,我无法评论约翰的回答,因为我没有足够的声誉点)。