2017-02-23 71 views
0

我更新後得到了一個觸發器:觸發處理多個更新

CREATE TRIGGER tgr_passagier_vlucht 
ON Vlucht 
AFTER UPDATE 
AS 
BEGIN 
IF @@ROWCOUNT=0 
    RETURN 
SET NOCOUNT ON 
IF EXISTS 
    (SELECT * 
    FROM inserted I 
    WHERE EXISTS(SELECT * FROM PassagierVoorVlucht P WHERE P.vluchtnummer = I.vluchtnummer)) 
BEGIN 
    ROLLBACK TRANSACTION 
    RAISERROR('Cannot update, Passenger is linked to flight ', 16,1)    
END                 
END 

我也得到了一些測試用例:

/*TestCase 1 --------------True*/ 
UPDATE Vlucht 
SET gatecode = 'B' 
WHERE vluchtnummer = 5314 

/*TestCase 2 --------------True*/ 
UPDATE Vlucht 
SET gatecode = 'A' 
WHERE vluchtnummer = 5318 

/*TestCase 3 --------------False*/ 
UPDATE Vlucht 
SET gatecode = 'B' 
WHERE vluchtnummer = 5316 

/*TestCase 4 --------------False*/ 
UPDATE Vlucht 
SET gatecode = 'B' 
WHERE vluchtnummer = 5317 

如果我運行順序測試它做工精細。我得到的消息:

(1行(S)的影響) (1行(S)的影響) 消息50000,級別16,狀態1,過程tgr_passagier_vlucht 19行 無法更新,乘客被鏈接到航班 消息3609,等級16,狀態1,行16 交易在觸發器中結束。該批次已被中止。

但是,當我運行測試用例例如它說的順序4,3,2,1:

消息50000,級別16,狀態1,過程tgr_passagier_vlucht 19行 無法更新,乘客與航班掛鉤 Msg 3609,Level 16,State 1,Line 6 交易在觸發器中結束。該批次已被中止。

觸發器被虛假測試用例卡住了。這是爲什麼?

+0

您的觸發器中不應該有事務邏輯。如果你的調用代碼有一個交易,那麼這對你的過程會造成嚴重破壞。你應該像你在做的那樣在觸發器中提出一個錯誤。 –

回答

5

問題不在你的觸發器中。

如果仔細查看錯誤消息,您將看到「該批次已被中止。」

因爲所有這些更新都在同一批次中,所以一旦出現錯誤,批處理將中止,並且不會繼續執行其他語句。

您可以在每次更新後添加批處理分隔符(GO),以便在出現錯誤後繼續執行批分隔符(GO)。

UPDATE Vlucht 
SET gatecode = 'B' 
WHERE vluchtnummer = 5317 
GO