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!
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
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
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
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-----.'