级联删除或使用触发器?

Mik*_*e_G 11 sql t-sql sql-server sql-server-2008

我正在经历一个我接管的项目,在数据库方面,我注意到以前的程序员编写了一堆触发器来删除子记录.问题是,这些记录已经与我要删除的父记录有外键关系.删除触发器只是子记录的简单删除语句.

编写触发器以删除子记录是否有好处,或者我可以将其更改为在删除时级联并且没问题?

我正在使用MSSQL 2008.

Mat*_*lie 16

MSSQL Server中的CASCADE DELETE只能级联到单个表.如果有两个表与维表的外键关系,则只能将删除级联到其中一个表.(这是为了防止删除级联通过多个路径并产生冲突,就像C++允许多重继承但C#只允许单继承)

在这种情况下,您将被迫使用触发器或专门处理代码中的大小写.

出于这个原因,我看到很多人选择在所有情况下使用触发器.即使只有一张外国桌子.这确保了一致性,因此人们知道维护数据库时要查找的内容.

如果可以将删除级联到多个表,我会说这将是最优选的选项.然而,这种限制使水泛滥,我现在更倾向于拥有所有这些行为的触发器.使用触发器进行级联删除和更新的开销在编码方面只是次要的,但确实允许真正通用的标准实践.

编辑:

您可能希望将"已接受的答案"移动给其他人,我已经解决了我上面的错误.

您可以将多个事实表具有ON DELETE CASCADE外键对应于单元尺寸表.

你不能做的是有一个事实表对多个维度表有ON DELETE CASCADE外键约束.

例如......
- 维度表[Person](id INT IDENTITY,)
- 维度表[考试](id INT IDENTITY,)
- 人脸表[Exam_Score](person_id INT,exam_id INT,得分INT)

如果删除了人员或考试,您还希望删除关联的Exam_Score记录.

这在MS SQL Server中使用ON DELETE CASCADE是不可能的,因此需要触发器.

(向Mehrdad道歉,他试图向我解释这一点,但我完全错过了他的观点.)


Meh*_*ari 10

远离不必要的触发器.

一起去的ON DELETE CASCADE,如果这就是你需要做的.

  • 我的立场得到了纠正,并相应地更新了我的答案,对于盲目和无知的组合道歉...... (4认同)
  • Dems:它支持引用一个表的多个表.它还支持其他表引用的那些表.但是,它不支持循环或多个级联路径.例如,它支持B - > A,C - > A,D - > C但它不支持B - > A,C - > A,D - > C,D - > A. (2认同)