我正在完成一个我接管的项目,在数据库方面,我注意到以前的程序员编写了一堆触发器来删除子记录。问题是,这些记录已经与我要删除的父记录有一个外键关系。delete触发器只不过是子记录的简单delete语句。
编写触发器来删除子记录是否有好处,或者我是否可以将其更改为cascade on delete,这样就可以了?
我正在使用MSSQL 2008。
发布于 2009-09-21 21:48:11
MSSQL Server中的CASCADE DELETE只能级联到单个表。如果您有两个与维度表具有外键关系的表,则只能级联删除其中一个表。(这是为了防止删除通过多个路径级联并造成冲突,就像C++允许多个继承但C#只允许单个继承一样)
在这种情况下,您必须在代码中使用触发器或专门处理这种情况。
出于这个原因,我看到很多人在所有情况下都选择使用触发器。即使只有一个外部表。这确保了一致性,因此人们知道在维护数据库时要寻找什么。
如果可以将delete级联到多个表,我会说这将是最可取的选择。然而,这一限制搅乱了局面,我目前更倾向于拥有所有这些行为的触发器。使用触发器进行级联删除和更新的开销只在编码方面很小,但确实允许真正通用的标准实践。
编辑:
你可能想把“公认的答案”转给其他人,我已经发现我在上面的问题上错了。
对于一个单一维度表,可以有多个事实表具有ON DELETE级联外键约束。
您不能做的是让一个事实表具有对多个维度表的ON DELETE级联外键约束。
举个例子。
表维度表Person
如果删除了人员或检查,您会希望关联的Exam_Score记录也被删除。
在MS SQL Server中使用ON DELETE CASCADE是不可能的,因此需要触发器。
(向Mehrdad道歉,他试图向我解释这一点,但我完全理解不了他的意思。)
发布于 2009-09-21 21:37:58
远离不必要的触发器。
如果这是您需要做的全部工作,请使用ON DELETE CASCADE。
发布于 2009-09-21 21:38:33
我会在delete时使用cascade,但只有在父对象被删除的情况下,您才会确定要删除子对象。
如果您有任何条件逻辑(如果在星期天删除,我只删除子对象),则使用触发器。
我只需在开发系统上将其更改为cascade on delete,然后运行我的单元测试并确保没有任何损坏。
https://stackoverflow.com/questions/1457013
复制相似问题