gpt4 book ai didi

sql-server - 当另一个字段发生实际变化时,sql server 触发更新时间字段

转载 作者:行者123 更新时间:2023-12-01 09:06:26 24 4
gpt4 key购买 nike

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

假设您有一个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 字段。

最佳答案

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

对于“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

关于sql-server - 当另一个字段发生实际变化时,sql server 触发更新时间字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6806120/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com