【问题标题】:Trigger has an error at first action触发器在第一次操作时出错
【发布时间】:2015-02-16 04:22:29
【问题描述】:

我有更新插入的触发器

CREATE TRIGGER tgBooking_update_seat
ON dbo.booking
AFTER INSERT, UPDATE
AS
BEGIN
    IF EXISTS (SELECT * FROM INSERTED) BEGIN
       -- Handle insert or update
       UPDATE Seats 
       SET status = Bookings.statusBooked
       FROM dbo.seat Seats
       INNER JOIN INSERTED Bookings ON Bookings.noSeat = Seats.noSeat
   END 
END

这是我的桌子seat。此表是我的座位列表,此表有一个 status 列,我默认设置为 0。

这是我的桌子booking。默认情况下,我将每个插入操作都设置为 statusBooked 为 1。如果end 等于当前时间,那么statusBooked 将自动更新为0。

我想将dbo.seat 上的status 自动更新为与dbo.booking 上的statusBooked 相同的值。

  • 如果statusbooked 为1,则status 应更新为1
  • 如果 statusBooked 更新为 0,则 status 也必须更新为 0

所以状态是 noSeat 的引用 statusBooked。我编写了触发器,它可以工作。

但在第一次(当所有dbo.seat 状态为 0 时)它不起作用。

例子:

(当 status 全部为 0 时)我确实插入了 booking(noSeat : 1-5),statusBooked 为 1 但 status(noSeat:1-5) 保持为 0。然后我插入了第二次,它只是工作。我再次插入booking (noSeat : 1-7)statusBooked 是 1 和 status(noSeat : 1-7) 也是 1。但是status 的 noSeat 1-5 仍然是 0。

我只有 1 个触发器。那么有什么问题呢?

【问题讨论】:

  • statusBook是计算列吗?
  • 计算?你什么意思?
  • 如何自动更新到0列statusBook?。

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


【解决方案1】:
FROM dbo.seat Seats
INNER JOIN INSERTED Bookings
ON Bookings.noSeat = Seats.noSeat

我认为您的触发器中不需要此代码块,因为您已经提到您正在更新一行中的 Seats 表:

UPDATE Seats SET

我建议你这样重写,然后再试一次:

 UPDATE Seats SET
 status = Bookings.statusBooked
 WHERE Bookings.noSeat = Seats.noSeat

另外我建议您尝试使用关键字“new”而不是 INSERTED,因为我自己的触发器有一些问题,我得到了这个建议。希望对你有帮助! 这是我关于触发器的问题...有人回答了,您也可以参考它,这是链接:

I have a syntax error in my code for creating a trigger using sql. I use mysql version 14.14

【讨论】:

  • 问题被标记为sql-server。所以inserted 是正确的,new 是不正确的。
猜你喜欢
  • 2011-09-02
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-09
  • 2015-11-26
  • 1970-01-01
  • 2015-11-14
相关资源
最近更新 更多