当另一个字段发生真正的变化时,sql server触发更新时间字段

时间:2011-07-24 09:52:59

标签: sql-server triggers

如果更新了该行的一个或多个字段,我需要一个更新表行字段的触发器。

假设您有一个Employees表,可能如下所示:

EmployeeId    Name       Address                ModificationDate
1             Spears     27 Sober Road 
2             Jagger     65 Straight Street 

如果除EmployeeIdModificationDate字段之外的任何字段的值发生实际更改,则触发器应生成时间值并更新ModificationDate

实际变化的示例1:

update dbo.Employees
set Name = 'Beggar'
where EmployeeId = 2

没有真正改变的例子2:

update dbo.Employees
set Name = 'Jagger'
where EmployeeId = 2

如果执行示例2中的更新,则触发器不应更新ModificationDate字段。

1 个答案:

答案 0 :(得分:9)

在触发器中,您可以访问“已插入”和“已删除”系统表。 这些表包含表中已由导致触发器执行的语句更新的记录。

对于'UPDATE'触发器,'inserted'表包含它们处于新状态的记录,'deleted'表包含具有旧值的记录。

您必须使用这两个表来找出哪些记录确实已更改,并更新这些记录的ModificationDate。

我认为触发器内的语句看起来像这样。 (我没有测试过它)

UPDATE myTable
SET ModificationDate = getdate()
FROM inserted, deleted
WHERE inserted.EmployeeId = deleted.EmployeeId
AND (inserted.Name <> deleted.Name OR inserted.Address <> deleted.Address)

编辑: 我玩了一下:

create trigger upd_employee on [employee] after update
as
begin

    update employee
    set modifdate = getdate()   
    where employee.empid in 
    ( select i.empid
      from inserted i
      inner join deleted d on i.empid = d.empid 
      where (i.name <> d.name or i.address <> d.address )
    )
end

insert into employee 
values
(1, 'Frederik' , '', null)

insert into employee
values
(2, 'User', '', null)

update employee
set [address] = 'some address'

select * from employee

update employee set [name] = 'test' where empid = 2

select * from employee

update employee set [name] = 'test' where empid = 2

select * from employee