触发器处理多个更新

Yak*_*ent 0 sql-server sql-server-2008

更新后我有一个触发器:

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
Run Code Online (Sandbox Code Playgroud)

我还得到了一些测试用例:

/*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
Run Code Online (Sandbox Code Playgroud)

如果我按此顺序运行测试,它工作正常.我收到了消息:

(受影响的1行)(受影响的1行)消息50000,等级16,状态1,程序tgr_passagier_vlucht,行19无法更新,乘客与航班消息3609,等级16,状态1,行16相关联交易在触发器中结束.批次已中止.

但是当我以4,3,2,1的顺序运行测试用例时,它说:

消息50000,级别16,状态1,过程tgr_passagier_vlucht,第19行无法更新,乘客链接到航班消息3609,级别16,状态1,行6事务在触发器中结束.批次已中止.

触发器被错误的测试用例卡住了.这是为什么?

小智 5

问题不在您的触发器中.

如果仔细查看错误消息,您将看到"批处理已中止".

由于所有这些更新都在同一批次中,因此一旦出现错误,批处理就会中止,并且不会继续进行其他语句.

您可以在每次更新后添加批处理分隔符(GO),以使它们在错误发生后继续.

UPDATE Vlucht
SET gatecode = 'B'
WHERE vluchtnummer = 5317
GO
Run Code Online (Sandbox Code Playgroud)