【发布时间】:2014-05-07 07:17:49
【问题描述】:
我正在尝试编写一个触发器来审核表的每个字段——表中一行的旧值和新值。如果任何字段已被修改,我需要将字段旧值和新值连同字段名称一起保存在审计表中,作为新条目。
create trigger Trg_Institution_FieldAudit on Table1 AFTER UPDATE AS
DECLARE @OldName VARCHAR(30)
DECLARE @CurrentName VARCHAR(30)
DECLARE @OldId VARCHAR(30)
DECLARE @CurrentId VARCHAR(30)
DECLARE @modifiedBy VARCHAR(30)
If update(Name)
BEGIN
select @OldName = Name from deleted
select @CurrentName = Name from Inserted
select @OldId = ID from deleted
select @currentId = ID from Inserted
select @modifiedBy = modifiedBy from deleted
--INSERT statement for Name field alone
END;
这适用于少数字段,但我有很多字段(超过 60 个),并且由于很多 if 条件,我没有达到所需的性能。有没有更好的方法来做到这一点?最重要的是,该表中大约有 300 万条记录发生并发更新,这使得很多事情出错:(
编辑:UPDATE 语句只会更新一行
【问题讨论】:
-
您的触发器有 MAJOR 缺陷,因为您似乎认为它会每行调用一次 - 那是不是 b> 情况。触发器将每个语句触发一次,因此如果您的
UPDATE语句影响 25 行,您将触发触发器一次,然后是Inserted和 @987654324 @ 每个将包含 25 行。您的代码将在这 25 行中选择哪一行?select @OldName = Name from deleted- 它是不确定的 - 它会选择一个 - 并忽略所有其他行。您需要重写触发器以考虑到这一点! -
好的,我明白了。谢谢你。如果我们认为更新语句总是一次发生在一行上,即 1 行的 1 个 UPDATE 语句,那么检查所有已更新的列并在审计表中创建单独条目的理想方法是什么?跨度>
标签: sql-server database triggers