【问题标题】:How to Insert Update Trigger sql server如何插入更新触发器 sql server
【发布时间】:2015-02-12 03:14:27
【问题描述】:

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

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

  • dbo.seat 具有列 noSeat, statusSeat

我插入到dbo.bookingstatusBooked 值设置为 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 值。

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

为什么?

【问题讨论】:

  • 您的表 seat 似乎通过 noSeat 列引用了 booking - 对吧?那么为什么你甚至需要statusSeat 列呢?只需加入dbo.Booking 表并读出statusBooked - 没有必要让两列包含相同的信息,并担心保持它们同步 - 避免这种数据冗余!
  • 是的,座位参考通过 noSeat 列预订。因为我有一些座位,我想显示哪个已预订和哪个可用,所以我添加了 statusSeat。 statusBooked 仅用于“交易”状态。如果我没有添加 statusSeat,我将很难在我的项目的另一个案例中执行。那么如何解决我上面的问题呢? @marc_s

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


【解决方案1】:

假设您想查看 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 语句。而且,这是在触发器内部,所以它实际上并不是你使用的 Booking。

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

【讨论】:

  • 我不明白。请多解释一下
  • 什么是你不明白的?试试这个。在 Seat 中选择几行并更改 statusSeat 的值,使其与 Booking 中的状态不匹配。然后执行我在上面发布的每个查询。看到这样为你准备的所有数据可能会很有启发性。然后执行更新语句——除了使用 Booking 而不是 Inserted。它有效吗?如果您在任何时候有不明白的具体内容,请向我们展示您得到的结果,并告诉我们您不明白的地方。
【解决方案2】:

如果我是对的,这将解决您的问题。如果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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-15
    • 1970-01-01
    相关资源
    最近更新 更多