INSTEAD OF UPDATE 触发器“无效的列名‘cost’。”

问题描述 投票:0回答:1

Image of error and SQL code

我正在为我的游艇数据库编写一个 INSTEAD OF UPDATE tigger,但我在游艇表中的列名称 cost 方面遇到了麻烦。该错误表明它是无效的列名,但我已检查它的拼写是否正确并且已刷新我的数据库。这就是它的样子。请问有人可以帮助我吗?

sql-server triggers
1个回答
0
投票

在 SQL Server 触发器中,触发器的工作方式可能与其他数据库引擎中的有所不同。

对于插入、更新和删除触发器,实际表已经使用新值进行了更改,而在 INSTEAD OF 触发器中,还没有任何更改。

SQL Server 公开由两个伪表(称为

inserted
deleted
)更新、插入或删除的数据,触发器代码可以读取和推理它们。 不同的触发器可以访问不同的表(简化):

  • 插入触发器使用正在插入的所有行填充插入表
  • deleted 触发器用所有被删除的行填充已删除表
  • 更新触发器是一种特殊触发器,它用插入的新数据填充插入表,用旧数据填充删除表。
  • 而不是触发器填充与上面相同的表

另一个区别是SQL Server同时处理整个数据量,而不是逐行处理。这是一个经典的陷阱,许多人搞砸了并认为触发代码只处理一行。

那么,您的具体问题呢? 根据上面的内容,IF(成本> 1200)没有任何意义,因为触发器无法访问列,而是可以访问表。

你想要的是这样的:

IF EXISTS(
  SELECT 1
  FROM inserted i
  WHERE cost > 1200
)
begin
   rollback transaction
   RETURN
end
ELSE
BEGIN
   UPDATE t
   SET cost = i.cost * 1.1
   FROM yacht t
   INNER JOIN inserted i
     ON i.yachtID = t.yachtID
END

请注意,您还必须更改更新,并将插入的行与真实的表连接在一起。

这一切在 Microsoft 触发器文档

都有更好的解释
© www.soinside.com 2019 - 2024. All rights reserved.