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,如果这就是你需要做的.