2010-07-05 38 views
28

我需要在SQL Server 2008中創建觸發器,這些觸發器將一些值更改爲Log表的行從一行中插入!觸發器插入舊值 - 已更新的值

例如,如果我有表僱員有列ID,名稱,密碼,我更新此表並插入新的值的列名稱,比我需要插入表中的更新後,在表日誌中的員工的值。

我該怎麼做?謝謝!

+1

你的問題不是很清楚,你可以改換並可能展開。如果你能提供一個你想要的例子,它會有所幫助。 – 2010-07-05 18:01:23

+0

例如我有這樣的價值,如 id 3; 名稱Jon; 密碼Jon; 現在我更新表Employees並更改名稱Jon到Mark,在我更新之前我需要在日誌表中插入值3,Jon,Jon。 – user383875 2010-07-05 18:08:18

回答

30

下面是一個例子更新觸發器:

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 
72

在您的觸發器中,您有兩個可用的僞表,InsertedDeleted,其中包含這些值。

對於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 

基本上,你加入InsertedDeleted僞表,搶ID(這是同樣的,我相信,在這兩種情況下),從Deleted表中的舊值,從Inserted表中的新價值,和你的一切存儲在LogTable

0
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-----.'