【发布时间】:2011-05-22 10:35:12
【问题描述】:
如果用户更改表 HelloWorlds,那么我想要“他们执行的操作”、执行时间,并将原始行的副本插入到 HelloWorldsHistory。
由于列的长度,我希望避免插入、更新和删除操作的单独触发器。
我试过了:
create trigger [HelloWorlds_After_IUD] on [HelloWorlds]
FOR insert, update, delete
as
if @@rowcount = 0
return
if exists (select 1 from inserted) and not exists (select 1 from deleted)
begin
insert into HelloWorldHistory (hwh_action, ..long column list..)
select 'INSERT', helloWorld.id, helloWorld.text ... and more from inserted
end
else
if exists (select 1 from inserted) and exists (select 1 from deleted)
begin
insert into HelloWorldHistory (hwh_action, ..long column list..)
select 'UPDATE', helloWorld.id, helloWorld.text ... and more from deleted
end
else
begin
insert into HelloWorldHistory (hwh_action, ..long column list..)
select 'DELETE', helloWorld.id, helloWorld.text ... and more from deleted
end
end
我从未见过插入出现,但我看到了更新。我将尝试 3 个单独的触发器,但维护列列表不会很有趣。
【问题讨论】:
-
不要使用 DELETED 作为 UPDATE 的数据源,您只会记录之前已经记录的值。您的日志行将是“更新”类型,但数据可能来自插入。在我的回答中看到我的评论。
标签: sql-server tsql triggers dml