新行插入相同 table 后错误更新触发器
Error update trigger after new row has inserted into same table
我想更新 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 设置为 NULL
的 QT 记录。
这个触发器不依赖于单行插入;无论插入的行数如何,它都会起作用 - 打破行的可能性要小得多。
我想更新 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 设置为 NULL
的 QT 记录。
这个触发器不依赖于单行插入;无论插入的行数如何,它都会起作用 - 打破行的可能性要小得多。