2012-10-08 65 views
1

我在向SQL Server中的外鍵添加級聯刪除時遇到問題。表A有三列。表A中的第1列和第2列是對錶B中同一列的外鍵查找。我希望刪除表B中的一行,以基於這些外鍵對錶A上的行上的刪除進行級聯。SQL Server外鍵引起週期或多個級聯路徑

表A中的另一列有一個外鍵查找表C.如果表C中的行被刪除,那麼我想對應的單元格設置爲空表A

當我加入這些限制我引發了錯誤:

引入表'RelatedDeliverableUnit'上的FOREIGN KEY約束'FK_RDU_TODELIVERABLEUNITREF'可能會導致循環或多個級聯路徑。指定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"/>      

預先感謝任何幫助

回答

2

我無法找到相應的文件爲更高版本,但SQL Server 2000 BOL解決此問題:

The series of cascading referential actions triggered by a single DELETE or UPDATE must form a tree containing no circular references. No table can appear more than once in the list of all cascading referential actions that result from the DELETE or UPDATE. The tree of cascading referential actions must not have more than one path to any given table. Any branch of the tree is terminated when it encounters a table for which NO ACTION has been specified or is the default.

而後來的版本並沒有改變這一點。你落下的這個犯規:我知道做到這一點

The tree of cascading referential actions must not have more than one path to any given table

的唯一途徑是實現B和A使用INSTEAD OF觸發,而不是使用ON DELETE...之間的瀑布之一。

表A和C之間的關係不應受到任何這種影響。


2008 BOL

+0

謝謝你的建議。我也想知道添加這是一個單一的外鍵,兩列查找相同的引用列,但我不確定這是否允許。我得看看我猜的觸發器! – Fraser

相關問題