我想更新OrigOrderNbr和OrigOrderType(QT类型),因为当我创建第一个列时,它们都是Null值。但是,在创建S2(将QT转换为S2)之后,OrigOrderType和OrigOrderNbr(S2)将从QT参考中获取。取而代之的是,我也想将其更新为QT。
http://i.stack.imgur.com/6ipFa.png
http://i.stack.imgur.com/E6qzT.png
CREATE TRIGGER tgg_SOOrder
ON dbo.SOOrder
FOR INSERT
AS
DECLARE @tOrigOrderType char(2),
@tOrigOrderNbr nvarchar(15)
SELECT @tOrigOrderType = i.OrderType,
@tOrigOrderNbr = i.OrderNbr
FROM inserted i
UPDATE dbo.SOOrder
SET OrigOrderType = @tOrigOrderType,
OrigOrderNbr = @tOrigOrderNbr
FROM inserted i
WHERE dbo.SOOrder.CompanyID='2'
and dbo.SOOrder.OrderType=i.OrigOrderType
and dbo.SOOrder.OrderNbr=i.OrigOrderNbr
GO
在运行该触发器之后,它显示了消息“错误#91:另一个进程已更新了” SOOrder”记录。您的更改将丢失。
每串长长的评论,包括有关@marc_s和@Damien_The_Unbeliever使用适当的触发器编写技术的一些出色建议,以及我目前对您的问题的更好理解,以下是重新设计的触发器:
CREATE TRIGGER tgg_SOOrder
ON dbo.SOOrder
FOR INSERT
AS
--Update QT record with S2 record's order info
UPDATE SOOrder
SET OrigOrderType = 'S2'
, OrigOrderNbr = i.OrderNbr
FROM SOOrder dest
JOIN inserted i
ON dest.OrderNbr = i.OrigOrderNbr
WHERE dest.OrderType = 'QT'
AND i.OrderType = 'S2'
AND dest.CompanyID = 2 --Business logic constraint
AND dest.OrigOrderNbr IS NULL
AND dest.OrigOrderType IS NULL
基本上,该想法是一旦创建了类型为“ S2”的匹配记录,就更新任何类型为“ QT”的记录。此处匹配意味着S2记录的OrigOrderNbr与QT记录的OrderNbr相同。关于CompanyID设置为2的情况,我保留了业务逻辑约束。此外,我们只关心修改OrigOrderNbr和OrigOrderType设置为的QT记录NULL
。
该触发器不依赖于单行插入;无论插入的行数如何,它都可以工作-几乎没有可能破坏行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句