触发器插入旧值 - 已更新的值

use*_*875 38 sql t-sql sql-server-2008

我需要在SQL Server 2008中创建触发器,从一行中插入所有值,其中一些值已更改为Log表!

例如,如果我有表的Employees具有列id,名称,密码,并且我更新此表并为列名插入新值,那么我需要在表Log中更新表中Employees之后的值.

我怎么能这样做?谢谢!

mar*_*c_s 91

在触发器中,您有两个可用的伪表,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
Run Code Online (Sandbox Code Playgroud)

基本上,你加入InsertedDeleted伪表,抓取ID(在两种情况下都是相同的,我认为),Deleted表中的旧值,表中的新值Inserted,以及将所有内容存储在LogTable

  • @gsubiran:你永远不应该*更新你的主键. (5认同)

And*_*mar 38

这是一个示例更新触发器:

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
Run Code Online (Sandbox Code Playgroud)

这将打印:

id   EmployeeId   LogDate                   OldName
1    1            2010-07-05 20:11:54.127   Zaphoid
Run Code Online (Sandbox Code Playgroud)