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 交易在触发器中结束。该批次已被中止。
触发器被虚假测试用例卡住了。这是为什么?
您的触发器中不应该有事务逻辑。如果你的调用代码有一个交易,那么这对你的过程会造成严重破坏。你应该像你在做的那样在触发器中提出一个错误。 –