2010-07-05 2 views
28

Мне нужно создать триггер в SQL Server 2008, который вставлял все значения из одной строки, в которой какое-то значение было изменено в таблицу журналов!Триггер вставить старые значения-значения, которые были обновлены

Например, если у меня есть таблица Сотрудники, у которых есть идентификатор, имя, пароль, и я обновляю эту таблицу и вставляю новое значение для имени столбца, чем мне нужно вставлять значения, которые были в таблице Сотрудники после обновления в таблице Лог.

Как я могу это сделать? Благодаря!

+1

Ваш вопрос не очень понятно, вы можете перефразировать его и, возможно, расширить его. Если бы вы могли привести пример того, что вам понравится, это поможет. –

+0

Например, у меня есть значение id 3; имя Jon; пароль Jon; Теперь я обновляю таблицу Employees и меняю имя Jon на Mark, прежде чем обновлять это, мне нужно вставить в значения таблицы журналов 3, Jon, Jon. – user383875

ответ

30

Вот триггер пример обновления:

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 

Это будет печатать:

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

В вашем триггере у вас есть две таблицы псевдо-таблиц, Inserted и Deleted, которые содержат эти значения.

В случае ОБНОВЛЕНИЯ таблица Deleted будет содержать старые значения, а таблица Inserted содержит новые значения.

Так что, если вы хотите, чтобы войти в ID, OldValue, NewValue в вашем триггером, вы должны были бы написать что-то вроде:

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 

В принципе, вы присоединиться к Inserted и Deleted псевдо-таблицы, возьмите идентификатор (который то же самое, я полагаю, в обоих случаях), старое значение из Deleted таблицы, новое значение из Inserted таблицы, и вы храните все в 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-----.' 
Смежные вопросы