如何插入更新触发器sql server

时间:2015-02-12 03:14:28

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

我有2个表dbo.bookingdbo.seat这些结构:

  • dbo.bookingnoBooking, noSeat, start, [end], statusBooked

  • dbo.seatnoSeat, statusSeat

我插入dbo.booking的所有数据行(statusBooked值设置为1)然后dbo.seatstatusSeat(默认为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则无效。但对于第二个和前进它是有效的。 statusSeat值的值为statusBooked

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

为什么?

2 个答案:

答案 0 :(得分:0)

假设您想要查看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;

答案 1 :(得分:0)

如果我是对的,这将解决您的问题。如果statusSeat已更新,则statusBooked列会在statusBooked列中更新。如果statusSeat已插入并且statusBooked大于0(因为它默认为0),您的statusBooked列将会更新为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