2013-10-16 4 views
3

Je souhaite apporter une modification (Set Deleted = 1) rangées étant inséré dans ma table CustomerContact si la retourne déclaration SELECT plus de 0.MSSQL Trigger - Mise à jour enregistrement inséré sur INSERT

Je les éléments suivants, mais il reste non 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 ma déclaration IF, je me sers FROM INSERTED, en supposant que cela retournera le id nouvellement inséré pour l'enregistrement qui a été créé par l'insert.

J'ai deux questions au sujet de cette déclaration:

  • cette partie de la déclaration remplirai un UPDATE juste le dossier qui vient d'être inséré dans CustomerContact?

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

  • Est-ce la façon qui serait jugé correct de faire un changement à une ligne qui vient d'être inséré en fonction du résultat d'une déclaration SELECT?

CustomerContactID est une colonne à clé primaire auto-incrémentée.

Répondre

2

Vous dites "juste l'enregistrement qui a été inséré". Inserted peut contenir plusieurs enregistrements. S'il n'y en a qu'un, votre déclencheur fonctionnera comme prévu. Mais s'il y en a plus d'un, ce ne sera pas le cas.

Je réécrire votre logique en une seule instruction update le long des lignes 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. 
+0

Est-il possible d'effectuer le déclencheur pour chaque ligne? – Luke

+0

Bonne idée! Je vais essayer – Luke

+0

Pouvez-vous expliquer pourquoi l'essai original de OP ne fonctionnerait pas s'il y avait plusieurs lignes insérées? Je ne le vois pas, il définit '@ numrows' où' o.orderid IN (SELECT OrderID FROM INSERTED) 'cherche IF (@numrows> = 1)' et met à jour 'WHERE CustomerContactID IN (SELECT CustomerContactID FROM INSERTED)' où échouerait-il exactement? De couse votre syntaxe en utilisant 'JOIN's est plus belle;) – DrCopyPaste

1
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 futher costume pour les besoins, l'espoir CA aidera.

+0

Merci d'avoir pris le temps de regarder mon problème! +1 – Luke

0

Voici la solution finale que je l'habitude de 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 
Questions connexes