多个外键和级联删除SQL Server

3
在SQL Server 2014中,我试图在3个外键上添加级联删除(CASCADE DELETING)。如果我在一个关系中添加了级联删除,那么它可以正常工作。但是如果我添加多个级联删除,它就会出现问题(会出现循环依赖错误消息)。
在上面的图表中,您可以看到用户表和任务表(西班牙语中称为“Tareas”)。因此,当用户被删除时,我需要将Tasks中的标记字段设置为NULL。
这在数据库中很常见,所以我认为有一种方法可以处理这个问题。
在我的情况下,大多数表都有一对字段,用于保存创建或修改记录的用户的UserId。因此,我需要解决这个模式,并将其应用于多个地方。

将一个位列添加到用户表中并将其用作状态会更简单。 - Zohar Peled
1个回答

3
CASCADE DELETE 表示在您的情况下,如果您删除一个用户,则 SQL Server 也会删除任何附加的任务。也就是说,整行将被删除。除了数据意外丢失、参照完整性丢失或无限递归删除等问题外,这种行为根本不是您想要的。您已经说明只想将任务表中的关联用户列标记为空。
作为建议,您考虑实现 TRIGGER 吗?像这样(没有测试过,将其视为伪代码!):
CREATE TRIGGER DeleteTareasTrigger
ON Users
BEFORE DELETE AS
BEGIN

UPDATE t
SET t.CreadaPor = NULL
FROM DELETED as d
INNER JOIN Tareas t ON d.UserID = t.CreadaPor

UPDATE t
SET t.ModifcadaPor = NULL
FROM DELETED as d
INNER JOIN Tareas t ON d.UserID = t.ModifcadaPor

END
GO

或者采用另一种方法,在用户表上添加一个位字段,指示该人是否处于活动/已删除状态。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接