2017-02-23 77 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