我试图将带有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列出它们?
答案 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
我知道这可能很耗时,特别是对于大型数据库而言,你必须很好地了解你的数据库,但这是我现在最好的注意事项:)。