【问题标题】:Invalid column name in SQL Server triggerSQL Server 触发器中的列名无效
【发布时间】:2017-05-01 05:00:15
【问题描述】:

如果预订被取消,我有以下代码可以从表格中删除信息,但我收到以下错误:

消息 207,级别 16,状态 1,过程 trgDelBooking,第 10 行
列名“BookingStatus”无效。

但是列名绝对正确。

这是我的代码:

ALTER TRIGGER trgDelBooking
ON HVCBookings
AFTER UPDATE
AS
BEGIN
    SELECT * 
    FROM Inserted

    DELETE FROM HVCActivityBooking
    WHERE PartyID = (SELECT PartyID FROM inserted)
      AND BookingStatus = 'CANCELLED'
END
GO

有什么建议吗?

【问题讨论】:

  • 我认为数据库:HVCActivityBooking.BookingStatus 不存在。
  • 请同时提供表结构。
  • 您的触发器有 MAJOR 缺陷,因为您似乎认为它会每行调用一次 - 那是不是 b> 情况。触发器将每条语句触发一次,因此如果您的语句更新 25 行,您将触发触发器一次,但随后Inserted 伪表将包含 25 行.您的代码将在这 25 行中选择哪一行? (SELECT PartyID FROM inserted) - 它是不确定的,您将获得任意行,您将忽略所有其他行。您需要重写触发器以考虑到这一点!
  • @marc_s:我同意你的评估,但是如果Inserted 有不止一行,它不会给出Subquery returned more than 1 value 错误吗?我不希望它在触发器中的工作方式有所不同(与触发器之外的查询相反)。
  • @BenThul:是的,可能 - 你是对的。整个触发器本身就有缺陷。

标签: sql sql-server triggers


【解决方案1】:

除了列名的问题之外,您的触发器假设inserted 只有一行。这是一个非常糟糕的假设。查询应该是:

DELETE FROM HVCActivityBooking
WHERE PartyID IN (SELECT PartyID FROM inserted) AND
      BookingStatus = 'CANCELLED';

当然,这并不能解决未知列问题。它只是让触发器更安全。

编辑:如果BookingStatusHVCBookings 中,那么WHERE 条件可以进入子查询:

DELETE FROM HVCActivityBooking
WHERE PartyID IN (SELECT i.PartyID FROM inserted i WHERE i.BookingStatus = 'CANCELLED');

【讨论】:

  • 谢谢。我将条件从 DELETE 查询移到 SELECT 因为 BookingStatus 在 HVCBookings 而不是 HVCActivityBookings 中,正如你提到的,菜鸟错误。再次感谢
猜你喜欢
  • 2020-10-17
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 2017-04-12
  • 2016-08-27
  • 1970-01-01
相关资源
最近更新 更多