【发布时间】:2020-07-31 00:43:54
【问题描述】:
我有一个 AFTER 触发器,我正在尝试将其用于等效的 INSTEAD OF 触发器。我有点理解如何执行 INSTEAD OF 触发器来代替触发操作,但转换它让我有点迷茫。
这是我的 AFTER 触发器:
go
CREATE TRIGGER tgr_priceValidation
ON Products_Copy
FOR INSERT, DELETE AS
BEGIN
IF exists (select UnitPrice from Products_copy where UnitPrice NOT BETWEEN 0.50 AND 500.00)
BEGIN
RAISERROR(
' No product is allowed to have a unit price out of the range between $0.50 and $500.00',
16,
1
)
ROLLBACK TRANSACTION
END
END
go
上述触发器强制执行价格范围规则,要求每个价格都在 0.50 到 500 美元之间。
【问题讨论】:
-
如果价格不在范围内,您是要阻止整个插入,还是应该仍然允许插入有效记录?
-
等一下。首先,哪种
DELETE语句会导致您的行中出现UnitPrice超出定义范围的行?接下来,您真的需要为每个INSERT扫描整个 表吗?即使UPDATE会产生超出范围的值,您也会忽略它? -
努力吧。首先,更正您的后触发器中的错误。您应该参考虚拟插入和删除表,而不是定义触发器的表(可能 - 但这是没有很好要求的猜测)。接下来,尝试编写代替触发器。有什么不同吗?好吧,instead-of 触发器必须实际对表执行操作(插入、更新、删除)。
标签: sql sql-server tsql database-trigger