我有表A,B,C .A有一个可空的FK到B,称为BId,B有一个FK到C,带有级联删除。
当删除C时,我需要将A上的BId设置为NULL。因此,当C上的DELETE级联到B时,我希望执行以下触发器:
CREATE TRIGGER AFTER_DELETE_B
ON B
FOR DELETE
AS
BEGIN
DECLARE @bId INT
SELECT @bId = Id FROM DELETED
UPDATE A
SET BId = NULL
WHERE BId = @bId
END
然而,这似乎有时会执行而不是其他人。无法弄清楚原因。
答案 0 :(得分:2)
您的触发器不处理多行删除,它只捕获已删除行中的一个ID并更新表A中的相关值,因为只有一个变量,
您需要使用基于集合的方法来处理多个删除。
为此您需要修改触发器定义,如此.....
CREATE TRIGGER AFTER_DELETE_B
ON B
FOR DELETE
AS
BEGIN
SET NOCOUNT ON;
UPDATE A
SET A.BId = NULL
FROM A
INNER JOIN DELETED D ON A.BId = D.Id
END