我正在经历一个我接手的项目,在数据库方面,我注意到以前的程序员编写了许多触发器来删除子记录。事实是,这些记录已经与我要删除的父记录有外键关系。删除触发器不过是子记录的简单删除语句。
编写触发器以删除子记录是否有好处,或者我可以仅将其更改为在删除时级联即可吗?
我正在使用MSSQL 2008。
*MSSQL Server中的 *CASCADE DELETE 只能级联到单个表。如果您有两个与维表具有外键关系的表,则只能级联删除到其中一个表。(这是为了防止删除通过多个路径级联并造成冲突,就像C ++允许多重继承,而C#仅允许单一继承一样)
在这种情况下,您将不得不使用触发器或在代码中专门处理该情况。
因此,我看到许多人在所有情况下都选择使用触发器。即使只有一张外国桌子。这样可以确保一致性,因此人们知道维护数据库时要查找的内容。
如果可以将一个删除级联到一个以上的表,我会说这将是最可取的选择。但是,这种限制使情况更加混乱,我目前更赞成拥有所有此类行为的触发器。就编码而言,使用触发器进行级联删除和更新的开销很小,但确实允许真正通用的标准实践。
编辑:
您可能想将“已接受的答案”移给其他人,我已经算出我在上述问题上是错的。
您可以有多个事实表,它们具有对DESIGNE Dimension表的ON DELETE CASCADE外键约束。
您不能做的是拥有一个事实表,并具有对多个维度表的ON DELETE CASCADE外键约束。
因此,例如…- 维度表[人](id INT IDENTITY,) -维度表[考试](id INT IDENTITY,) -面孔表[Exam_Score](person_id INT,exam_id INT,得分INT)
如果“人员”或“考试”中的任何一个被删除,则您希望关联的Exam_Score记录也被删除。
在MS SQL Server中使用ON DELETE CASCADE是不可能的,因此需要触发器。
(向迈尔达德致歉,他试图向我解释这一点,但我完全错过了他的观点。)