首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Cascade on Delete还是use Triggers?

Cascade on Delete还是use Triggers?
EN

Stack Overflow用户
提问于 2009-09-21 21:35:31
回答 4查看 9.6K关注 0票数 10

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

编写触发器来删除子记录是否有好处,或者我是否可以将其更改为cascade on delete,这样就可以了?

我正在使用MSSQL 2008。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-21 21:48:11

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

在这种情况下,您必须在代码中使用触发器或专门处理这种情况。

出于这个原因,我看到很多人在所有情况下都选择使用触发器。即使只有一个外部表。这确保了一致性,因此人们知道在维护数据库时要寻找什么。

如果可以将delete级联到多个表,我会说这将是最可取的选择。然而,这一限制搅乱了局面,我目前更倾向于拥有所有这些行为的触发器。使用触发器进行级联删除和更新的开销只在编码方面很小,但确实允许真正通用的标准实践。

编辑:

你可能想把“公认的答案”转给其他人,我已经发现我在上面的问题上错了。

对于一个单一维度表,可以有多个事实表具有ON DELETE级联外键约束。

您不能做的是让一个事实表具有对多个维度表的ON DELETE级联外键约束。

举个例子。

表维度表Person

  • Dimension表Exam

  • Face
  • Exam_Score

如果删除了人员或检查,您会希望关联的Exam_Score记录也被删除。

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

(向Mehrdad道歉,他试图向我解释这一点,但我完全理解不了他的意思。)

票数 16
EN

Stack Overflow用户

发布于 2009-09-21 21:37:58

远离不必要的触发器。

如果这是您需要做的全部工作,请使用ON DELETE CASCADE

票数 12
EN

Stack Overflow用户

发布于 2009-09-21 21:38:33

我会在delete时使用cascade,但只有在父对象被删除的情况下,您才会确定要删除子对象。

如果您有任何条件逻辑(如果在星期天删除,我只删除子对象),则使用触发器。

我只需在开发系统上将其更改为cascade on delete,然后运行我的单元测试并确保没有任何损坏。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1457013

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档