2010-07-05 15 views
28

Potrzebuję utworzyć wyzwalacz w SQL Server 2008, który poszedł wstawić wszystkie wartości z jednego wiersza, w którym niektóre wartości zostały zmienione na Tabela dziennika!Wywołać wstawić stare wartości - wartości, które zostały zaktualizowane

Na przykład, jeśli mam pracowników tabeli, które mają identyfikator kolumny, nazwę, hasło, i zaktualizować tę tabelę i wstawić nową wartość dla nazwy kolumny, niż muszę wstawić wartości, które było w tabeli Pracownicy po aktualizacji w tabeli Log.

Jak mogę to zrobić? Dzięki!

+1

Twoje pytanie nie jest bardzo jasne, można przeformułować je i ewentualnie go rozwinąć. Jeśli mógłbyś podać przykład tego, co chcesz, to pomogłoby. –

+0

Na przykład mam wartość tego jak id 3; imię Jon; hasło Jon; Teraz aktualizuję tabelę Pracownicy i zmieniam imię Jon na Marka, zanim zaktualizuję to, muszę wstawić wartości logów 3, Jon, Jon. – user383875

Odpowiedz

30

Oto spust przykład zmiana:

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 

ten wypisze:

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

W wyzwalaczu są dostępne dwa pseudo-tabele, Inserted i Deleted, które zawierają te wartości.

W przypadku UPDATE, tabela Deleted będzie zawierała stare wartości, natomiast tabela Inserted zawiera nowe wartości.

Więc jeśli chcesz logować się ID, OldValue, NewValue w swoim spust, trzeba by napisać coś takiego:

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 

Zasadniczo, można dołączyć do pseudo-tabel Inserted i Deleted, chwyć identyfikator (co jest tak samo, jak sądzę, w obu przypadkach), starą wartość z tabeli Deleted, nowa wartość z tabeli Inserted i zapisać wszystko w 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-----.' 
Powiązane problemy