级联Delete(删除),或使用触发器?(Cascade on Delete or use Trig

2019-07-18 20:52发布

林经历我已经接管项目,并在数据库方面我注意到,以前的程序员写了一堆触发器来删除子记录。 问题是,这些记录已经与我删除父记录AA外键关系。 删除触发器是什么,但对孩子的记录简单的DELETE语句。

有没有写一个触发器来删除子记录的好处,或者我可以改变它级联删除时和被罚款?

即时通讯使用MSSQL 2008年。

Answer 1:

级联 MSSQL Server只能级联删除一个表。 如果你有一个维度表的外键关系两个表,你只能级联删除其中之一。 (这是为了防止删除通过多个路径级联和创建冲突,多为C ++允许多重继承但C#只允许单继承)

如果是这样的话,你不得不使用触发器或专门处理在你的代码的情况。

为此,我见过很多人选择在任何情况下使用触发器。 即使只有一个外部表。 这将确保一致性和让人们知道要寻找什么维护数据库时。

如果人们可以级联删除到多个表我会说这将是最可取的选择。 这种限制,但是,muddies水域,目前更多的我赞成触发器拥有所有这些行为。 在使用触发器的级联删除和更新的开销仅在编码方面的未成年人,但允许那些忠实地通用的标准做法。

编辑:

您可能要移动“接受的答案”给别人,我已经工作了,我错了ABOT以上。

你可以有多个事实表对DELETE CASCADE外键约束上一个劲儿地维度表。

你不能做的是有一个事实表都具有ON DELETE CASCADE国外多个维度表键约束。

因此,例如...
- 规格表[人](ID INT IDENTITY)
- 规格表[考试](ID INT IDENTITY)
- 人脸表[Exam_Score](为person_id INT,exam_id INT,得分INT)

如果任何人或考试被删除,你会希望相关Exam_Score结果也被删除。

这是不可能的使用在MS SQL服务器中删除CASCADE,因此需要触发器。

(道歉迈赫达德谁试图解释这个给我,但我完全错过了他的观点。)



Answer 2:

远离不必要的触发器了。

与去ON DELETE CASCADE如果这就是你需要做的。



Answer 3:

我会用在删除级联,但只有当你确定要删除的孩子,如果家长被删除。

如果您有任何条件逻辑(我只是删除了孩子,如果在星期天删除),然后使用触发器。

我只是将其更改为cascade on delete ,在开发系统上,然后运行我的单元测试,并做出一定的,没有什么休息时间。



Answer 4:

我几乎与民主党同意在这里除了我使用ON DELETE CASCADE (和ON UPDATE CASCADE对这个问题)参照动作尽可能地只能求助于使用触发器必要。 我还考虑从表中撤销许可和强制使用的“助手”存储的特效为删除和更新。

叫我是个乐观主义者,但我相信)我的代码将生存移植到未来的MS SQL Server版本和b)SQL Server团队不久的将来会得到周围固定“一个级联路径”的限制,在这一点上,我”会更换级联参照动作触发器:)



文章来源: Cascade on Delete or use Triggers?