【问题标题】:SQL Server 2012 trigger: Auditing. How to see previous value of a row without shadow tableSQL Server 2012 触发器:审核。如何在没有影子表的情况下查看行的先前值
【发布时间】:2014-01-28 06:48:54
【问题描述】:

我正在尝试创建一个审核表。我在AdventureWorks 2012 数据库中有一个名为person.address 的表。

我正在使用触发器来捕获对表的更改,唯一的问题是我不知道是否可以在编辑之前使用触发器来捕获行。我正在尝试节省资源和开销,因此尽量不使用影子表。我知道没有“插入前”触发器。但是有什么方法可以捕获一行中包含的信息,并且当有人进行插入或更新时,可以在插入完成之前将这一行写入我的 audit.table 吗?

谢谢。

【问题讨论】:

  • 在更新触发器中,受影响的行的新版本在inserted伪表中,而受影响的行的旧版本在deleted中伪表。
  • 太棒了。这有助于解释它。谢谢。

标签: sql triggers sql-server-2012 audit


【解决方案1】:

给定一个有两行的简单表格:

CREATE TABLE dbo.foo(a INT PRIMARY KEY);

INSERT dbo.foo(a) VALUES(1),(2);

然后一个更新触发器只是为了演示:

CREATE TRIGGER dbo.trfoo ON dbo.foo FOR UPDATE
AS
BEGIN
  SET NOCOUNT ON;

  SELECT a FROM inserted;

  SELECT a FROM deleted;
END
GO

动作的结果,如:

UPDATE dbo.foo SET a += 1;

结果:

a    -- this is the *new* version of these rows
----
3
2

a    -- this is the *old* version of these rows
----
2
1

此外,还有一个 INSTEAD OF INSERT 触发器,它允许您在插入之前执行操作(它们不称为 BEFORE 触发器,因为您仍然必须自己执行插入)。 More info here.

【讨论】:

    猜你喜欢
    • 2016-09-18
    • 1970-01-01
    • 2021-08-31
    • 2013-09-29
    • 2014-05-04
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    相关资源
    最近更新 更多