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

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

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

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

38
задан user383875 5 July 2010 в 17:50
поделиться

3 ответа

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

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
38
ответ дан 27 November 2019 в 03:03
поделиться

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

1
ответ дан 27 November 2019 в 03:03
поделиться

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

91
ответ дан 27 November 2019 в 03:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: