我是SQL Server触发器的新手,并试图编写一个不执行我想要的触发器的触发器。我敢肯定有一个明显的原因,但是我看不到问题所在?你们中有谁更熟练地看到触发脚本中出现的所有obvioius错误吗?插入或更新表预订时发生的事情并不是什么,但是例如,我希望当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
此评论太长了。
您的触发器刚坏。损坏从代码的第一行开始:
select @bo_id = inserted.bookingid from inserted;
这假设inserted
只有一行。但这不是一个有效的假设。在SQL Server中(与大多数其他数据库不同),触发器是基于set的。 inserted
(和deleted
)“表”引用可以具有多行。
考虑到这一点,您的整个触发器都需要重写。对于大多数操作,可以在基于集合的逻辑中使用inserted
和deleted
。在某些情况下,您可能需要使用游标或其他机制遍历每个值。