比方说,我有一个层次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