多行更新触发器

时间:2017-09-18 15:24:51

标签: sql sql-server sql-server-2008

我有这个触发器:

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'

我收到以下消息: enter image description here

多数民众赞成正确,但此更新声明触及两个不同的航班号。 PassengerForFlight中不存在的一个,以及PassengerForFlight中存在的一个。

我想要的是: 1行受影响,然后是错误消息

1 个答案:

答案 0 :(得分:0)

你的JOIN没有错。问题是您使用了IF EXISTS()。您编码的是:“如果INSERTED表中存在PassengerForFlight表中的任何行,则会抛出错误。

由于您抛出错误,触发器将回滚它正在参与的任何事务。

执行所需操作的一种方法是将其更改为INSTEAD OF触发器,并打印消息而不是抛出错误。

您当前的代码的理念是“让UPDATE发生,如果存在某些条件,则抛出错误并将其回滚。”这只会以影响整个UPDATE(所有行)的方式发生。

我建议使用“不是请求UPDATE,而是更新满足某个条件的那些行。如果请求的UPDATE中的任何行不满足该条件,则给用户一条消息。”