2015-07-21 75 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'等消息 –