在 SQL Server 2014 中,我试图在 3 FK 上添加 CASCADE DELETING。如果我在一个关系中添加一个级联删除,它工作正常。如果我添加更多的级联删除,它将不起作用(循环检测到错误消息)。
在上图中,您可以看到Users 表和Tasks 表(西类牙语为“Tareas”)。所以,我需要完成的是当用户被删除时,我需要将Tasks中标记的字段设置为NULL。
这在数据库中很常见,所以我认为有一种方法可以处理这个问题。
在我的例子中,我的大多数表都有一对字段,其中包含创建或修改记录的用户的 UserId。因此,我需要解决此模式以将其应用于多个地方。
最佳答案
CASCADE DELETE 意味着在您的情况下,如果您删除一个用户,那么 SQL Server 也会删除任何附加的任务。也就是说,将删除整行。除了数据意外丢失、引用完整性丢失或无限递归删除的可能性等问题外,这种行为无论如何都不是您想要的。您已声明您只想将 Tasks 表中的关联用户列标记为空。
作为建议,您是否考虑过实现 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
或者作为另一种方法,在 User 表上添加一个位字段来指示该人是否处于事件状态/已删除状态。
关于sql-server - 几个外键和级联删除SQL Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29585164/