Подтвердить что ты не робот

Триггер вставить старые значения - значения, которые были обновлены

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

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

Как я могу это сделать? Спасибо!

4b9b3361

Ответ 1

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

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

Ответ 2

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

В случае UPDATE таблица 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

Ответ 3

В SQL Server 2008 для этого вы можете использовать Change Data Capture. Подробная информация о том, как настроить его на таблице, приведена здесь http://msdn.microsoft.com/en-us/library/cc627369.aspx

Ответ 4

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