【发布时间】:2012-04-30 18:19:25
【问题描述】:
假设我在一个层次结构中有 3 个表:
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 也会出现同样的问题。这是一个简单的例子,但想象级联路径要大得多。它似乎很容易在一条长长的级联路径中滚雪球。
那么处理这种情况的最佳做法是什么?
【问题讨论】:
-
您希望触发器做什么(而不是删除)不会破坏参照完整性?
-
我想避免给示例增加进一步的复杂性,因为我不是在寻找表重新设计解决方案,而是针对特定场景的答案。但是作为参考,TableC 使用邻接列表模型来存储层次结构。我正在使用 INSTEAD OF 触发器通过层次结构递归删除。由于使用的是 SS2005,因此无法使用 HierarchyID。
-
无需重新设计表格,或许这会有所帮助:SQL Server: deleting with self-referential FOREIGN KEY
-
就我个人而言,我会使用存储过程来控制 DELETE。没有级联,没有触发器。
-
触发器就像一个乒乓球被扔进一个装满捕鼠器的房间,m'kay。
标签: sql sql-server triggers cascade referential-integrity