MSSQL Trigger – Mise à jour de l'logging nouvellement inséré sur INSERT

Je souhaite apporter une modification (Set Deleted = 1) aux lignes étant insérées dans ma table CustomerContact si l' SELECT renvoie plus de 0.

J'ai ce qui suit, mais cela n'a pas encore été testé:

 CREATE TRIGGER mark_cust_contact_deleted ON CustomerContact AFTER INSERT AS BEGIN DECLARE @numrows INT; /* Determine if order matches criteria for marking customer contact as DELETED immediately */ SELECT @numrows = COUNT(*) FROM [Order] o JOIN OrderMeterDetail om ON o.OrderID = om.OrderID WHERE o.WorkTypeID = 3 AND o.WorkActionID = 26 AND o.WorkStageID IN (109, 309, 409) AND om.MeterDetailTypeID = 1 AND om.MeterLocationID IN (2, 4) AND o.orderid IN (SELECT OrderID FROM INSERTED); /* If the order matches the criteria, mark the customer contact as deleted */ IF (@numrows >= 1) UPDATE CustomerContact SET Deleted = 1 WHERE CustomerContactID IN (SELECT CustomerContactID FROM INSERTED); END 

Dans mon instruction IF , j'utilise FROM INSERTED , en supposant que cela renverra l' identifiant nouvellement inséré pour l'logging qui a été créé par l'insert.

J'ai deux questions à propos de cette déclaration:

  • Est-ce que cette partie de l'instruction effectuera une UPDATE juste l'logging qui vient d'être inséré dans CustomerContact ?

    UPDATE CustomerContact SET Deleted = 1 WHERE CustomerContactID IN (SELECT CustomerContactID FROM INSERTED);

  • Est-ce la manière qui serait jugée correcte pour apporter une modification à une ligne qui vient d'être insérée en fonction du résultat d'une SELECT ?

CustomerContactID est une colonne de key primaire auto-incrémentée.

Vous dites "Juste le disque qui a été inséré". Inserted peut contenir plus d'un logging. S'il n'y en a qu'un, votre triggersur fonctionnera comme prévu. Mais s'il y en a plus d'un, ce ne sera pas le cas.

Je réécrirais votre logique dans une seule déclaration de update à update sur le model de …

  Update CustomerContact Set Deleted = 1 From CustomerContact inner join inserted on CustomerContact.CustomerContactID = inserted.CustomerContactID inner join orders on inserted.OrderID = orders.OrderID where -- some criteria. 
 CREATE TRIGGER mark_cust_contact_deleted ON CustomerContact AFTER INSERT AS BEGIN DECLARE @numrows INT; /* Determine if order matches criteria for marking customer contact as DELETED immediately */ -- Get all the records into a temp table SELECT * INTO #Temp FROM inserted Declare @ID int; SELECT @numrows = COUNT(*) FROM [Order] o JOIN OrderMeterDetail om ON o.OrderID = om.OrderID WHERE o.WorkTypeID = 3 AND o.WorkActionID = 26 AND o.WorkStageID IN (109, 309, 409) AND om.MeterDetailTypeID = 1 AND om.MeterLocationID IN (2, 4) AND o.orderid IN (SELECT OrderID FROM #Temp); IF (@numrows >= 1) BEGIN WHILE EXISTS (SELECT TOP 1 * FROM #Temp) BEGIN SELECT TOP 1 @ID = ID FROM #Temp /* If the order matches the criteria, mark the customer contact as deleted */ UPDATE CustomerContact SET Deleted = 1 WHERE CustomerContactID IN (SELECT CustomerContactID FROM #Temp WHERE ID = @ID); DELETE FROM #Temp WHERE ID = @ID END END DROP TABLE #Temp END 

Je pense que vous pouvez faire quelque chose comme ça, modifier le code pour répondre à vos besoins, espérons que cela vous aidera.

Voici la dernière solution que j'ai utilisée pour résoudre ce problème:

 CREATE TRIGGER mark_cust_contact_deleted ON CustomerContact AFTER INSERT AS BEGIN UPDATE CustomerContact SET Deleted = 1 FROM CustomerContact cc JOIN inserted i ON cc.CustomerContactID = i.CustomerContactID JOIN [Order] o ON i.OrderID = o.OrderID JOIN OrderMeterDetail om ON i.OrderID = om.OrderID WHERE o.WorkTypeID = 3 AND o.WorkActionID = 26 AND o.WorkStageID IN (109, 309, 409) AND om.MeterDetailTypeID = 1 AND om.MeterLocationID IN (2, 4) END