Триггер вставить старые значения - значения, которые были обновлены - PullRequest
36 голосов
/ 05 июля 2010

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

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

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

Ответы [ 5 ]

89 голосов
/ 05 июля 2010

В вашем триггере есть две псевдотаблицы, 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

37 голосов
/ 05 июля 2010

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

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
1 голос
/ 06 июля 2010

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

0 голосов
/ 17 апреля 2018

ALTER вызывает ETU на Employee FOR UPDATE AS для вставки в журнал (EmployeeId, LogDate, OldName) выберите EmployeeId, getdate (), имя из удаленного файла go

0 голосов
/ 29 сентября 2016
    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-----.'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...