sql server触发器不更新字段

nvbavucw  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(446)

我是sql server触发器的新手,曾尝试编写一个不符合我要求的触发器。我肯定有一个明显的原因,但我可以´你没看到问题吗?你们中有谁更擅长这一点,看到任何明显的错误(s)我做了我的触发脚本?当表booking被插入或更新时发生的事情实际上并不是什么,但是我曾经希望当列faretypeid='fakt'时,列faretocollect已经更改为0。

ALTER TRIGGER [dbo].[Fare] 
   ON  [dbo].[Booking] 
   AFTER INSERT,UPDATE
   AS 
BEGIN
SET NOCOUNT ON;

Declare @bo_id int
Declare @leg_id int
Declare @fare_sum real
Declare @Payment_Type_Id varchar

Select @bo_id = inserted.bookingid from inserted
Select @fare_sum = inserted.fareamount from inserted
Select @leg_id = ba.LegId from BookingActivity ba inner join BookingLegs bl on bl.LegId=ba.LegId where bl.BookingId=@bo_id and bl.LegNum=0
Select @Payment_Type_Id = inserted.PaymentTypeId from inserted

IF  @Payment_Type_Id = 'FAKT'
    BEGIN
        UPDATE Booking
        SET FareToCollect = 0
        FROM inserted ins
        INNER JOIN booking bo on ins.BookingId=bo.BookingId 

        UPDATE BookingActivity
        SET FareAmount = 0
        FROM BookingActivity 
        WHERE BookingActivity.LegId=@leg_id
    END;
ELSE
    BEGIN
        UPDATE Booking
        SET FareToCollect = @fare_sum
        FROM inserted ins
        INNER JOIN booking bo on ins.BookingId=bo.BookingId

        UPDATE BookingActivity
        SET FareAmount = @fare_sum
        FROM BookingActivity
        WHERE BookingActivity.LegId=@leg_id 
    END

END
rta7y2nd

rta7y2nd1#

这太长了,不能发表评论。
你的扳机坏了。中断从代码的第一行开始:

select @bo_id = inserted.bookingid from inserted;

这是假设 inserted 只有一行。但这不是一个有效的假设。在sql server中(与大多数其他数据库不同),触发器是基于设置的。这个 inserted (和 deleted )“表”引用可以有多行。
考虑到这一点,你的整个触发器都需要重写。对于大多数操作, inserted 以及 deleted 可用于基于集合的逻辑。在某些情况下,可能需要使用游标或其他机制遍历每个值。

相关问题