如何插入更新触发器sql server



我有两个具有以下结构的表dbo.bookingdbo.seat

  • dbo.booking具有列noBooking, noSeat, start, [end], statusBooked

  • dbo.seat具有列noSeat, statusSeat

我插入到dbo.booking的每一行数据(statusBooked值设置为1),然后在dbo.seat列上statusSeat(默认为0)将更新为1。

如果statusBooked被更新为0,则statusSeat也将更新为0。

我的意思是statusSeat(默认为0)将更新并遵循statusBooked值。

我试着使用一个触发器:

ALTER TRIGGER [dbo].[TriggerUpdateSeat] 
ON [dbo].[booking]
AFTER INSERT, UPDATE 
AS
    UPDATE dbo.seat
    SET seat.statusSeat = i.statusBooked
    FROM Inserted i
    WHERE dbo.seat.noSeat = i.noSeat;

但问题是,当我第一次在dbo.booking上插入数据时,dbo.seat填充的statusSeat必须更新为1,但它没有更新为1——它不起作用。但对于第二个和第二个前锋来说,这是有效的。CCD_ 18值在CCD_ 19值之后。

这个问题只有在我第一次运行程序并插入数据时才会发生。

为什么?

假设您想在Booking中查看数据,并在Seat中查看匹配的数据。你可以通过加入来做到这一点。

select  b.*, s.*
from    Booking  b
join    Seat     s
   on   s.noSeat = b.noSeat;

但您希望将结果集限制在座位状态值不同的地方。

select  s.*, b.*
from    Seat     s
join    Booking  b
   on   b.noSeat = s.noSeat
   and  b.statusBooked <> s.statusSeat;

现在把它变成一个update语句。但同时,这是在触发器内部,所以它实际上不是你使用的预订。

update  s
    set s.statusSeat = b.statusBooked
from    Seat     s
join    Inserted b
   on   b.noSeat = s.noSeat
   and  b.statusBooked <> s.statusSeat;

如果我是对的,这将解决您的问题。如果statusBooked已更新,则您的statusSeat列将更新为statusBooked列。如果statusBooked Inserted和statusBooked大于0(因为默认为0),则您的statusSeat列将更新为statusBooked列。

 ALTER TRIGGER [dbo].[TriggerUpdateSeat] 
    ON [dbo].[booking]
    AFTER INSERT, UPDATE 
    AS
IF UPDATE (statusBooked)
BEGIN
        UPDATE dbo.seat
            SET seat.statusSeat = i.statusBooked
            FROM Inserted i
            WHERE dbo.seat.noSeat = i.noSeat;
END
ELSE
BEGIN
        UPDATE dbo.seat
            SET seat.statusSeat = i.statusBooked
            FROM Inserted i
            WHERE dbo.seat.noSeat = i.noSeat and i.statusBooked>0;
END

最新更新