2009-11-02 15 views
2

J'ai une table où, lors d'une mise à jour d'enregistrement unique, un déclencheur ajoute un enregistrement d'historique dans une autre table . Lorsque j'exécute une mise à jour de plusieurs enregistrements sur la table, le déclencheur ne fonctionne pas car il a été implémenté pour fonctionner avec un seul enregistrement et un déclencheur s'exécute une seule fois pour une instruction, qu'elle affecte plusieurs enregistrements. Y a-t-il un moyen de faire ce travail?Mise à jour d'enregistrement multiple Déclenchement d'un déclencheur une fois

Puis-je utiliser le contrôle suivant:

**if @@rowcount = 1** 

afin de traiter un seul enregistrement de la façon dont il est géré maintenant et dans l'instruction else de le manipuler d'une autre manière (que je ne sais pas) ?

Le problème est de savoir comment gérer chaque cas de manière atomique lorsque j'ai plusieurs enregistrements et comment puis-je prendre chaque enregistrement de la table INSERTED? Le déclencheur initialise actuellement certaines variables de la table INSERTED, met à jour la colonne datetime sur la même table et tente ensuite d'insérer un enregistrement d'historique à l'aide des variables initialisées que j'ai mentionnées précédemment. Donc, ce sont les étapes que je voudrais avoir en charge plusieurs enregistrements.

Quelqu'un peut-il me fournir un exemple ou des directives simples?

Nous vous remercions à l'avance

Répondre

1

Un exemple très basique, sans voir votre logique de déclenchement actuelle, exacte:

-- First update the datetime column for each record inserted 
UPDATE t 
SET t.DateField = GETDATE() 
FROM UnderlyingTable t 
    JOIN inserted i ON t.RecordId = t.RecordId 

-- then insert history record for each record inserted 
INSERT HistoryTable (DateCreated, RecordId, SomeOtherField) 
SELECT GETDATE(), i.RecordId, i.SomeOtherField 
FROM inserted i 
+0

Homme J'ai vu votre réponse après avoir posté ma propre réponse. Merci beaucoup vraiment !!! Votre exemple est plus propre et plus agréable ... Je suis pressé ici !!! – DaTroop

+0

J'accepterai votre réponse pour ma réponse parce que vous avez passé votre temps à poster la solution! – DaTroop

+0

N'ayez pas peur de modifier vos réponses! – Sam

0

Je trouve la solution comment faire prendre en compte plusieurs lignes.

D'abord je changer la date de chaque enregistrement de la table Table1 INSERTION où le match PKs

UPDATE Table1 set status_changed_on = (SELECT CASE WHEN Table1.status is null THEN null ELSE @now END) 
FROM INSERTED i 
WHERE Table1.table1_id = i.table1_id 

puis ajoutez un enregistrement d'historique comme celui-ci:

INSERT INTO [History] ([table1_id ], [status_changed_on]) 
SELECT table1_id, @now 
FROM INSERTED 

et c'est tout. Pour chaque enregistrement mis à jour provenant de la table INSERTED, j'insère un enregistrement d'historique où @now est le même pour tous les enregistrements. C'est juste une variable d'horodatage contenant le datetime.

La DML ci-dessus n'est pas la réelle car je ne peux pas poster le code de mon entreprise ici, mais vous obtenez l'image.

Merci!

Questions connexes