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)
| 归档时间: |
|
| 查看次数: |
46 次 |
| 最近记录: |