Триггер вставить старые значения - значения, которые были обновлены
Мне нужно создать триггер в SQL Server 2008, который вставлял все значения из одной строки, в которой какое-то значение было изменено в таблицу журналов!
Например, если у меня есть таблица Сотрудники, у которых есть идентификатор столбца, имя, пароль и я, обновляем эту таблицу и вставляем новое значение для имени столбца, чем мне нужно вставлять значения, которые были в таблице Employees после обновления в таблице Log.
Как я могу это сделать? Спасибо!
Ответы
Ответ 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-----.'