Я должен создать триггер в SQL Server 2008, который уведенная вставка все значения от одной строки, в которой некоторое значение было изменено в таблицу Log!
Например, если у меня есть Сотрудники таблицы, которые имеют идентификатор столбца, имя, пароль, и я обновляю эту таблицу и вставляю новое значение для имени столбца, чем я должен вставить значения, который был в таблице Employees после обновления в таблице Log.
Как я могу сделать это?Спасибо!
Вот пример триггера обновления:
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
В SQL Server 2008 для этого можно использовать систему отслеживания измененных данных. Подробная информация о том, как установить его на столе, находится здесь http://msdn.microsoft.com/en-us/library/cc627369.aspx
В вашем триггере доступны две псевдо-таблицы, 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