Sql server 当SQL Server无法创建外键时,它能告诉您找到了哪些路径吗?

Sql server 当SQL Server无法创建外键时,它能告诉您找到了哪些路径吗?,sql-server,tsql,Sql Server,Tsql,我试图将一个ON DELETE SET NULL的外键引入到一个具有复杂模式的数据库中 我正在使用的脚本已更改此命令名: ALTER TABLE a ADD CONSTRAINT FK_a_b FOREIGN KEY (b_id) REFERENCES b (b_id) ON DELETE SET NULL; 运行此脚本时,会收到以下错误消息: 在表“b”上引入外键约束“FK_a_b”可能会导致 循环或多个级联路径 我看不出多个

我试图将一个ON DELETE SET NULL的外键引入到一个具有复杂模式的数据库中

我正在使用的脚本已更改此命令名:

ALTER TABLE a
    ADD CONSTRAINT FK_a_b
        FOREIGN KEY (b_id) 
        REFERENCES b (b_id)
            ON DELETE SET NULL;
运行此脚本时,会收到以下错误消息:

在表“b”上引入外键约束“FK_a_b”可能会导致 循环或多个级联路径


我看不出多个路径是什么,是否有办法让SQL Server列出它们?

您可以检查依赖项,如下所述:


当您使用如图所示的T-SQL时,您只能得到一个级别,但如果您使用SSMS,它将级联到多个级别。

没有专门用于此目的的内置功能。我想,使用递归CTE,您可以在sys.foreign_键和两个其他系统视图上编写一个查询,这将列出级联路径

但最简单的解决方案是使用数据库图。首先添加不允许添加约束的表,然后右键单击并选择“添加相关表”。然后选择所有表并再次添加相关表,依此类推。为了保持图表的整洁,在这个过程中,取消选择或删除您知道不属于问题的表。 完成后,您将能够看到循环/多级级联:它们将是由1-N方向关系或1-1关系组成的链,在同一个表上开始和结束,或通过不同的路径从一个表指向另一个表

您可以使用类似于下面的代码排除不具有任何FK约束的表,这些表具有除“无”操作0以外的更新/删除操作。在此基础上,还可以排除只有一个此类FK约束的表

select
    object_name(parent_object_id),
    *
from sys.foreign_keys fk
where 1=2
    or delete_referential_action <> 0 
    or update_referential_action <> 0
我知道这可能非常耗时,尤其是对于大型数据库,而且您必须非常了解数据库,但这是我目前的最佳选择: