2014-06-25 3 views
4

Je dois identifier plusieurs mises à jour de colonne dans une table et les stocker dans une table d'audit.
Voici le schéma d'audit:Recherche de plusieurs colonnes mises à jour dans le déclencheur

auditid auditTimestamps updateFieldName oldFieldValue newFieldValue 

Nous avons un autre employé de la table avec le schéma:

EmpID EmpName Age Address1 Phone 

j'ai écrit déclencheur de mise à jour sur le schéma employé, lorsque l'enregistrement est mis à jour, déclencheur a été lancé et sur la gâchette i vérifier la valeur du champ a été mise à jour et conserve cette information sur le schéma de la table d'audit.

For checking field for update , i have used below code sample: 

    BEGIN 
      if update(empName) 
      begin 
       set @updatedcolumnname='empName'; 
       set @newvendorname=(SELECT empNameFROM inserted); 
       set @oldvendorname=(SELECT empNameFROM deleted); 
       //Here insert logic that insert above find values into audit table. 
      end 

       // Same check for all remaining fields(Age,Address1,Phone) 
    END 

Mais cela ne semble pas fonctionner pour moi. c'est insérer toutes les colonnes qui sont mises à jour et non mises à jour dans la table d'audit.

S'il vous plaît suggérer comment pourrait mettre en œuvre ci-dessus fonctionnellement.

Merci

Répondre

0

Vous pouvez utiliser merge commande au lieu de commande d'insertion dans votre déclencheur. Aussi, vous pouvez calculer votre colonne modifiée par requête suivante:

SELECT 'empName' AS FieldName, d.empName AS OldValue, i.empName AS NewValue 
FROM Inserted i 
INNER JOIN deleted d ON d.EmpID = i.EmpID 
WHERE i.EmpName<>d.ImpName 

UNION ALL 

SELECT 'Age', d.Age, i.Age 
FROM Inserted i 
INNER JOIN deleted d ON d.EmpID = i.EmpID 
WHERE i.Age<>d.Age 

UNION ALL 

SELECT 'Address1', d.Address1, i.Address1 
FROM Inserted i 
INNER JOIN deleted d ON d.EmpID = i.EmpID 
WHERE i.Address1<>d.Address1 

UNION ALL 

SELECT 'Phone', d.Phone, i.Phone 
FROM Inserted i 
INNER JOIN deleted d ON d.EmpID = i.EmpID 
WHERE i.Phone<>d.Phone 

Alors Votre requête:

MERGE AuditTable AS Destination 
USING (
     SELECT 'empName' AS FieldName, d.empName AS OldValue, i.empName AS NewValue 
     FROM Inserted i 
     INNER JOIN deleted d ON d.EmpID = i.EmpID 
     WHERE i.EmpName<>d.ImpName 

     UNION ALL 

     SELECT 'Age', d.Age, i.Age 
     FROM Inserted i 
     INNER JOIN deleted d ON d.EmpID = i.EmpID 
     WHERE i.Age<>d.Age 

     UNION ALL 

     SELECT 'Address1', d.Address1, i.Address1 
     FROM Inserted i 
     INNER JOIN deleted d ON d.EmpID = i.EmpID 
     WHERE i.Address1<>d.Address1 

     UNION ALL 

     SELECT 'Phone', d.Phone, i.Phone 
     FROM Inserted i 
     INNER JOIN deleted d ON d.EmpID = i.EmpID 
     WHERE i.Phone<>d.Phone 

    ) AS SOURCE ON SOURCE.FieldName = Destination.UpdateFieldName 
       AND SOURCE.OldValue = Destination.OldFieldValue 
       AND SOURCE.NewValue = Destinatino.NewFieldValue 
    WHEN MATCHED THEN UPDATE SET OldFieldValue = OldValue, 
           NewFieldValue = NewValue 
    WHEN NOT MATCHED THEN INSERT (UpdateFieldName, OldFieldValue, NewFieldValue) 
         VALUES(FieldName, OldValue,NewValue) 
+0

sql server affichant "nom de colonne non valide 'Id'." pour d.Id = i.Id.pls suggérer comment résoudre ceci. –

+0

@Atu Tha.I éditer mon post. Je dois être utilisé EmpID au lieu de Id. –

+0

thx man.pour votre réponse. –

Questions connexes