2015-07-21 72 views
0

我有表A,B,C。A有一个可空的FK到B,称为BId,B有一个FK到C,级联删除。AFTER DELETE触发器并不总是触发

当C被删除时,我需要A上的BId被设置为NULL。因此,当基于C级联删除至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 

然而,这似乎执行有时,而不是别人。无法弄清楚原因。

回答

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 
+0

我明白了。 “SET NOCOUT ON”的原因是什么? – user1569339

+0

只是为了压制'n rows affected'等消息 –