web-dev-qa-db-fra.com

Déclencheur insérer anciennes valeurs - valeurs qui ont été mises à jour

J'ai besoin de créer un déclencheur dans SQL Server 2008 qui va insérer toutes les valeurs d'une ligne dans laquelle une valeur a été modifiée dans la table de journal!

Par exemple, si j'ai des employés de table dont l'ID, le nom, le mot de passe et la colonne sont mis à jour et que j'insère une nouvelle valeur pour le nom de la colonne, il est nécessaire d'insérer les valeurs qui se trouvaient dans la table Employees après la mise à jour dans la table Log.

Comment puis-je faire ceci? Merci!

34
user383875

Voici un exemple de déclencheur de mise à jour:

create table Employees (id int identity, Name varchar(50), Password varchar(50))
create table Log (id int identity, EmployeeId int, LogDate datetime, 
    OldName varchar(50))
go
create trigger Employees_Trigger_Update on Employees
after update
as
insert into Log (EmployeeId, LogDate, OldName) 
select id, getdate(), name
from deleted
go
insert into Employees (Name, Password) values ('Zaphoid', '6')
insert into Employees (Name, Password) values ('Beeblebox', '7')
update Employees set Name = 'Ford' where id = 1
select * from Log

Cela va imprimer:

id   EmployeeId   LogDate                   OldName
1    1            2010-07-05 20:11:54.127   Zaphoid
37
Andomar

Dans votre déclencheur, vous avez deux pseudo-tables disponibles, Inserted et Deleted, qui contiennent ces valeurs.

Dans le cas d'un UPDATE, la table Deleted contiendra les anciennes valeurs, tandis que la table Inserted contiendra les nouvelles valeurs.

Donc si vous voulez enregistrer le ID, OldValue, NewValue dans votre déclencheur, vous devez écrire quelque chose comme:

CREATE TRIGGER trgEmployeeUpdate
ON dbo.Employees AFTER UPDATE
AS 
   INSERT INTO dbo.LogTable(ID, OldValue, NewValue)
      SELECT i.ID, d.Name, i.Name
      FROM Inserted i
      INNER JOIN Deleted d ON i.ID = d.ID

Fondamentalement, vous rejoignez les pseudo-tables Inserted et Deleted, saisissez l'ID (qui est le même, je présume, dans les deux cas), l'ancienne valeur de la table Deleted, la nouvelle valeur de la table Inserted et vous stockez tout dans la LogTable

84
marc_s

Dans SQL Server 2008, vous pouvez utiliser la capture de données modifiées pour cela. Vous trouverez ci-dessous des informations détaillées sur la configuration d'une table: http://msdn.Microsoft.com/en-us/library/cc627369.aspx

1
Martin Smith
    createTRIGGER [dbo].[Table] ON [dbo].[table] 
FOR UPDATE
AS
    declare @empid int;
    declare @empname varchar(100);
    declare @empsal decimal(10,2);
    declare @audit_action varchar(100);
    declare @old_v varchar(100)

    select @empid=i.Col_Name1 from inserted i;  
    select @empname=i.Col_Name2  from inserted i;   
    select @empsal=i.Col_Name2 from inserted i;
    select @old_v=d.Col_Name from deleted d

    if update(Col_Name1)
        set @audit_action='Updated Record -- After Update Trigger.';
    if update(Col_Name2)
        set @audit_action='Updated Record -- After Update Trigger.';

    insert into Employee_Test_Audit1(Col_name1,Col_name2,Col_name3,Col_name4,Col_name5,Col_name6(Old_values)) 
    values(@empid,@empname,@empsal,@audit_action,getdate(),@old_v);

    PRINT '----AFTER UPDATE Trigger fired-----.'
0
Masum