2010-07-05 13 views
28

Necesito crear un desencadenador en SQL Server 2008 que no haya insertado todos los valores de una fila en la que se cambió algún valor a la tabla de registro.Trigger insert old values- values ​​que se actualizó

Por ejemplo, si tengo una tabla Empleados que tienen identificación de columna, nombre, contraseña y actualizo esta tabla e inserto un nuevo valor para el nombre de columna, entonces necesito insertar valores que estaban en la tabla Empleados después de la actualización en tabla.

¿Cómo puedo hacer esto? ¡Gracias!

+1

su pregunta no es muy clara, se puede reformular y posiblemente ampliarlo. Si pudieras dar un ejemplo de lo que te gustaría, sería útil. –

+0

Por ejemplo, tengo un valor como id 3; nombre Jon; contraseña Jon; Ahora actualizo la tabla Empleados y cambio el nombre de Jon por Marcar, antes de actualizar esto necesito insertar en la tabla de registro valores 3, Jon, Jon. – user383875

Respuesta

30

he aquí un ejemplo de disparo actualización:

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 

Esto imprimirá:

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

En su activador, tiene dos pseudo-tablas disponibles, Inserted y Deleted, que contienen esos valores.

En el caso de una ACTUALIZACIÓN, la tabla Deleted contendrá los valores anteriores, mientras que la tabla Inserted contiene los valores nuevos.

Así que si desea registrar la ID, OldValue, NewValue en su gatillo, que había necesidad de escribir algo como:

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 

Básicamente, se une a los Inserted y Deleted pseudo-mesas, agarra el ID (que es el mismo, supongo, en ambos casos), el valor antiguo de la mesa Deleted, el nuevo valor de la tabla Inserted, y almacenar todo en el LogTable

0
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-----.' 
Cuestiones relacionadas