SQL Server可以告诉您在无法创建外键时找到了哪些路径?

时间:2015-04-20 14:27:17

标签: 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;

当我运行此脚本时,我收到以下错误消息:

  

介绍FOREIGN KEY约束' FK_a_b'在桌子上' b'可能会导致   循环或多个级联路径。

我无法看到多条路径是什么,是否有某些方法可以让SQL Server列出它们?

2 个答案:

答案 0 :(得分:0)

您可以按照此处所述检查依赖关系:

https://msdn.microsoft.com/en-us/library/ms190624.aspx

如图所示使用T-SQL时,只能获得一个级别,但如果使用SSMS,则会级联多个级别。

答案 1 :(得分:0)

仅为此目的没有内置功能。我想通过递归CTE,您可以在sys.foreign_keys和其他几个系统视图上编写一个查询,列出级联路径。

但最简单的解决方案是使用Database Diagrams来做到这一点。首先添加不允许添加约束的表,然后右键单击并选择“添加相关表”。然后选择所有表并再次添加相关表,依此类推。要保持图表清洁,请在此过程中取消选择或删除您知道不属于问题的表格。 在你完成之后,你将能够看到周期/多级联:它们将是1-N(方向问题)或1-1关系的链,从同一个表开始和结束,或者从一个表到另一个表通过不同的路径。

您可以使用类似于下面的代码来排除除了NO_ACTION(0)以外的更新/删除操作没有任何FK约束的表。在此基础上,您还可以排除仅具有此类型的一个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

我知道这可能很耗时,特别是对于大型数据库而言,你必须很好地了解你的数据库,但这是我现在最好的注意事项:)。