比方說,我有一個層次3個表:INSTEAD OF觸發器和CASCADE路徑
TableA -> TableB -> TableC
TableC
與TableB
一個外鍵關係,並TableB
與TableA
一個外鍵關係。
如果我刪除TableA
中的記錄,它應該級聯刪除整個層次結構。使用ON DELETE CASCADE
會正常工作。
但是讓我們假設我需要在TableC
上放置一個INSTEAD OF
觸發器。我的理解是,INSTEAD OF
觸發器不能放在具有刪除級聯的表上。取自MSDN:
對於INSTEAD OF觸發器,在具有指定級聯動作ON DELETE的參照關係的表上不允許使用DELETE選項。
如果我必須採取級聯刪除掉TableB->TableC
,我需要使用INSTEAD OF
觸發強制執行參照完整性,然後我有同樣的問題與TableB->TableA
。這是一個簡單的例子,但想象一下級聯路徑要大得多。它似乎可以在整個漫長的瀑布路徑中輕鬆滾動。
那麼,處理這種情況的最佳做法是什麼?
你想觸發器做什麼(而不是刪除),不會破壞參照完整性? – 2012-04-19 08:54:09
我想避免在示例中增加更多複雜因素,因爲我不是在尋找表格重新設計解決方案,而是針對特定場景的答案。但是作爲參考,TableC使用鄰接列表模型來存儲層次結構。我使用INSTEAD OF觸發器遞歸刪除整個層次結構。由於使用SS2005,HierarchyID是不可能的。 – 2012-04-19 09:03:59
沒有重新設計表格,這可能會有所幫助:[SQL Server:使用自引用FOREIGN KEY刪除](http://explainextended.com/2010/03/03/sql-server-deleting-with-self-referential-外鍵/) – 2012-04-19 09:13:44