2010-07-05 41 views
28

Tôi cần tạo trình kích hoạt trong SQL Server 2008 mà không còn chèn tất cả các giá trị từ một hàng mà một số giá trị đã được thay đổi thành bảng Nhật ký! Ví dụ nếu tôi có bảng Nhân viên có id cột, tên, mật khẩu và tôi cập nhật bảng này và chèn giá trị mới cho tên cột, hơn tôi cần chèn các giá trị trong bảng Nhân viên sau khi cập nhật trong bảng Nhật ký.Trình kích hoạt chèn giá trị cũ- giá trị đã được cập nhật

Tôi có thể làm như thế nào? Cảm ơn!

+1

câu hỏi của bạn không rõ ràng, bạn có thể diễn giải lại và có thể mở rộng nó. Nếu bạn có thể cung cấp một ví dụ về những gì bạn muốn nó sẽ giúp đỡ. –

+0

Ví dụ tôi có giá trị này như id 3; tên Jon; mật khẩu Jon; Bây giờ tôi cập nhật bảng Nhân viên và đổi tên Jon thành Mark, trước khi tôi cập nhật điều này, tôi cần chèn vào các giá trị bảng nhật ký 3, Jon, Jon. – user383875

Trả lời

30

Dưới đây là một ví dụ kích hoạt cập nhật:

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 

này sẽ in:

id EmployeeId LogDate     OldName 
1 1   2010-07-05 20:11:54.127 Zaphoid 
72

Trong trình kích hoạt, bạn có hai bảng giả, InsertedDeleted, chứa các giá trị đó.

Trong trường hợp CẬP NHẬT, bảng Deleted sẽ chứa các giá trị cũ, trong khi bảng Inserted chứa các giá trị mới.

Vì vậy, nếu bạn muốn đăng nhập những ID, OldValue, NewValue trong kích hoạt của bạn, bạn cần phải viết một cái gì đó như:

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 

Về cơ bản, bạn tham gia vào InsertedDeleted giả bảng, lấy ID (đó là giống nhau, tôi đoán, trong cả hai trường hợp), giá trị cũ từ bảng Deleted, giá trị mới từ bảng Inserted, và bạn lưu trữ tất cả mọi thứ trong 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-----.' 
Các vấn đề liên quan