SQL Server外键导致循环或多个级联路径

时间:2012-10-08 08:41:19

标签: sql-server liquibase

我在向SQL Server中的外键添加级联删除时遇到问题。表A有三列。表A中的第1列和第2列是表B中同一列的外键查找。我希望删除表B中的行,以根据这些外键在表A上的行上级联删除。

表A中的另一列具有对表C的外键查找。如果删除了表C中的行,那么我希望在表A中将相应的单元格设置为null。

当我添加这些约束时,我抛出了错误:

介绍FOREIGN KEY约束' FK_RDU_TODELIVERABLEUNITREF'在桌子上' RelatedDeliverableUnit'可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

我对此感到有些困惑,Oracle似乎对此逻辑非常满意。我正在使用Liquibase添加这些约束。我认为错误归结于我的逻辑而不是语法,但为了完整性,这里是管理外键的Liquidbase脚本:

    <addForeignKeyConstraint constraintName="FK_RDU_FROMDELIVERABLEUNITREF" baseTableName="relatedDeliverableUnit"
                             baseColumnNames="FROMDELIVERABLEUNITREF" referencedTableName="DELIVERABLEUNIT" referencedColumnNames="DELIVERABLEUNITREF" onDelete="CASCADE"/>

    <addForeignKeyConstraint constraintName="FK_RDU_TODELIVERABLEUNITREF" baseTableName="relatedDeliverableUnit"
                             baseColumnNames="TODELIVERABLEUNITREF" referencedTableName="DELIVERABLEUNIT" referencedColumnNames="DELIVERABLEUNITREF" onDelete="CASCADE"/>                        

    <addForeignKeyConstraint constraintName="FK_RDU_RELATIONSHIPREF"
                             baseTableName="relatedDeliverableUnit" baseColumnNames="RELATIONSHIPREF" referencedTableName="RELATIONSHIPTYPES" referencedColumnNames="RELATIONSHIPREF" onDelete="SET NULL"/>                      

提前感谢您提供任何帮助

1 个答案:

答案 0 :(得分:2)

我找不到更新版本的相应文档,但SQL Server 2000 BOL解决了这个问题:

  

由单个DELETE或UPDATE触发的一系列级联引用操作必须形成一个不包含循环引用的树。在DELETE或UPDATE产生的所有级联引用操作的列表中,任何表都不能出现多次。级联引用操作树不得包含任何给定表的多个路径。树的任何分支在遇到已指定NO ACTION或默认值的表时终止。

后来的版本没有改变这个。你犯了这个错误:

  

级联引用操作树不得包含任何给定表的多个路径

我知道实现此目的的唯一方法是使用INSTEAD OF触发器实现B和A之间的级联之一,而不是使用ON DELETE...

表A和表C之间的关系不应受任何影响。


2008 BOL