2015-02-12 41 views
0

我有2个表dbo.bookingdbo.seat与这些结构:如何INSERT,UPDATE触发器的SQL服务器

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

  • dbo.seat有列noSeat, statusSeat

每一行我插入到dbo.booking(设置为1),则上dbo.seatstatusSeat(值缺省情况下为0)如果statusBooked被更新为0,那么statusSeat也将更新为0。

将更新为1。

我的意思是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的值。

问题只发生在我第一次运行我的程序并插入数据。

为什么?

+0

看起来你的桌子'座位'通过'noSeat'列引用预订 - 对吗?那么为什么你甚至需要'statusSeat'列呢?只需连接到'dbo.Booking'表并读出'statusBooked' - 没有必要让两列包含相同的信息,并且担心让它们保持同步 - 避免这种数据冗余! – 2015-02-12 05:59:06

+0

是的,通过noSeat列的座位引用预订。 ,因为我有一些座位,我想显示哪些预订和哪些可用,所以我添加了statusSeat。 statusBooked仅用于“交易”状态。如果我没有添加statusSeat,我将很难在另一个案例中执行我的项目。那么如何解决我上面的问题? @marc_s – azalikaEriya 2015-02-12 06:23:57

回答

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; 
+0

我不明白。请详细解释一下 – azalikaEriya 2015-02-12 05:57:50

+0

你不明白的是什么?尝试这个。在Seat中选择几行并更改statusSeat的值,以使其与Booking中的状态不匹配。然后执行上面发布的每个查询。看到所有这些为你打好的数据都是非常有启发性的。然后执行更新语句 - 除了使用Booking而不是Inserted。它工作吗?如果在任何时候有某些你不明白的东西,告诉我们你得到的结果,并告诉我们你不了解的东西。 – TommCatt 2015-02-12 18:24:06

0

如果是正确的,这将解决您的问题。如果statusBooked已更新,您的statusSeat列将更新为statusBooked列。如果statusBooked插入且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