我正在为我的游艇数据库编写一个 INSTEAD OF UPDATE tigger,但我在游艇表中的列名称 cost 方面遇到了麻烦。该错误表明它是无效的列名,但我已检查它的拼写是否正确并且已刷新我的数据库。这就是它的样子。请问有人可以帮助我吗?
在 SQL Server 触发器中,触发器的工作方式可能与其他数据库引擎中的有所不同。
对于插入、更新和删除触发器,实际表已经使用新值进行了更改,而在 INSTEAD OF 触发器中,还没有任何更改。
SQL Server 公开由两个伪表(称为
inserted
和 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 触发器文档
都有更好的解释