我有这个触发器:
CREATE TRIGGER tgr_passenger_flight
ON Flight
AFTER UPDATE
AS
BEGIN
IF @@ROWCOUNT= 0 RETURN
SET NOCOUNT ON
BEGIN TRY
IF EXISTS
(SELECT 1
FROM inserted I inner join PassengerForFlight PV ON I.flightnumber= PV.flightnumber)
BEGIN
;THROW 50000, 'Cannot update, Passenger is linked to flight',1
END
END TRY
BEGIN CATCH
;THROW
END CATCH
END
它适用于一行更新。但是,当我更新多行时,它失败了。
我做错了什么?我是否必须使用 PassengerForFlight 更改联接?或者我是否也必须使用已删除伪表,因为它是一个更新后的触发器?
编辑: 当我运行此update-statement时:
UPDATE Flight
SET gatecode = 'B'
WHERE flightcode = 'KL'
多数民众赞成正确,但此更新声明触及两个不同的航班号。 PassengerForFlight中不存在的一个,以及PassengerForFlight中存在的一个。
我想要的是: 1行受影响,然后是错误消息
答案 0 :(得分:0)
你的JOIN没有错。问题是您使用了IF EXISTS()。您编码的是:“如果INSERTED
表中存在PassengerForFlight
表中的任何行,则会抛出错误。
由于您抛出错误,触发器将回滚它正在参与的任何事务。
执行所需操作的一种方法是将其更改为INSTEAD OF触发器,并打印消息而不是抛出错误。
您当前的代码的理念是“让UPDATE发生,如果存在某些条件,则抛出错误并将其回滚。”这只会以影响整个UPDATE(所有行)的方式发生。
我建议使用“不是请求UPDATE,而是更新满足某个条件的那些行。如果请求的UPDATE中的任何行不满足该条件,则给用户一条消息。”