新行插入相同 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 记录。

这个触发器不依赖于单行插入;无论插入的行数如何,它都会起作用 - 打破行的可能性要小得多。