在更新后我有了一个触发器:
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行受影响) (1行受影响) Msg 50000,16级,状态1,过程tgr_passagier_vlucht,19号线无法更新,乘客链接到Msg 3609,16级,状态1,16号线。交易以触发器结束。批处理已被中止。
但是,例如,当我使用订单4、3、2、1运行测试用例时,它说:
Msg 50000,16级,状态1,过程tgr_passagier_vlucht,19号线不能更新,乘客连接到Msg 3609,16级,状态1,6号线,交易在触发器中结束。批处理已被中止。
触发器被错误的测试用例卡住了。为什么会这样呢?
发布于 2017-02-23 20:02:08
问题不在你的扳机里。
如果仔细查看错误消息,您将看到“批处理已被中止”。
由于所有这些更新都在同一个批处理中,因此一旦您收到错误,批处理将中止,并且不会继续执行进一步的语句。
您可以在每次更新后添加一个批处理分隔符(GO),以使它们在错误后继续。
UPDATE Vlucht
SET gatecode = 'B'
WHERE vluchtnummer = 5317
GOhttps://stackoverflow.com/questions/42424827
复制相似问题