Déclencheur de mise à jour d'erreur après l'insertion d'une nouvelle ligne dans la même table

Je veux mettre à jour OrigOrderNbr et OrigOrderType (type QT) parce que quand je crée d'abord les deux colonnes sont la valeur nulle. Mais après la création de S2 (QT converti en S2), OrigOrderType et OrigOrderNbr (S2) prennent des references QT. Au lieu de cela, je veux également le mettre à jour pour 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 

Après que j'ai exécuté ce triggersur, il a montré le message 'Erreur # 91: Un autre process a mis à jour l'logging' SOOrder '. Vos changements seront perdus. '

Par longue string de commentaires, y compris d'excellentes suggestions concernant les bonnes techniques d'écriture de sortinggger par @marc_s et @Damien_The_Unbeliever, ainsi que ma meilleure compréhension de votre problème à ce stade, voici le triggersur retravaillé:

 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 

Fondamentalement, l'idée est de mettre à jour tout logging de type "QT" une fois qu'un logging correspondant de type "S2" est créé. La correspondance ici signifie que OrigOrderNbr de l'logging S2 est identique à l'logging OrderNbr of QT. J'ai gardé votre contrainte de logique métier en ce qui concerne CompanyID étant réglé à 2. En outre, nous nous soucions seulement de modifier les loggings QT qui ont OrigOrderNbr et OrigOrderType défini sur NULL .

Ce triggersur ne repose pas sur une insertion à une seule ligne; cela fonctionnera quel que soit le nombre de lignes insérées – ce qui est beaucoup less susceptible de dégrader la ligne.