【问题标题】:Passing new / old parameters in audit tables?在审计表中传递新/旧参数?
【发布时间】:2014-06-28 10:46:10
【问题描述】:

据我了解,审计表是某种跟踪表(即捕获基表中的更改)

INSERT / UPDATE op 如何处理旧值和新值?不知道怎么写代码

我需要从 Person.Address 写入 AddressLine1 的新旧值

这就是我所拥有的:

USE AdventureWorks2012;
GO

    -- AL1 is AddressLine1
-- also what about primary key???
CREATE TABLE AuditTable
(
    AL1Old      nvarchar(60)    not null,
    AL1New      nvarchar(60)    not null,
);
GO

-- should I update AuditTable there? 
-- I don't know how to insert Old and New value by trigger...
CREATE TRIGGER triggy
ON Person.Address
AFTER INSERT, UPDATE 
AS
-- ???
GO

【问题讨论】:

  • 您不需要审计表中某些内容的时间戳吗?开始考虑您需要从该审计表中得到什么并告诉我们。

标签: tsql parameters triggers sql-server-2012 audit


【解决方案1】:

如果您想在触发器中插入新旧数据,那么这UPDATE 触发器中起作用 - INSERT 触发器没有任何“旧”数据,很明显。

基本上,你需要从Deleted伪表中获取旧数据,从Inserted伪表中获取新数据。

另外:请注意,触发器每个语句调用一次,并且两个伪表都可以(并且将!)包含多行 - 因此对触发器进行相应的编程。

要处理 Addressline1 列 - 尝试这样的事情(是的,我还建议包含主键来标识该数据的行!)

-- AL1 is AddressLine1
-- also what about primary key???
CREATE TABLE AuditTable
(
    PrimaryKey INT NOT NULL,
    AL1Old      nvarchar(60)    not null,
    AL1New      nvarchar(60)    not null,
);
GO

-- I don't know how to insert Old and New value by trigger...
CREATE TRIGGER addressUpdateTrigger
ON Person.Address
AFTER UPDATE 
AS
    INSERT INTO dbo.AuditTable(PrimaryKey, AL1Old, AL1New)
       SELECT
          Inserted.AddressID,      -- primary key
          Deleted.AddressLine1,    -- old data
          Inserted.AddressLine1    -- new data
       FROM 
          Inserted
       INNER JOIN
          Deleted on Inserted.AddressID = Deleted.AddressID

GO

【讨论】:

  • 上帝般的回答,谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 2020-01-05
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
相关资源
最近更新 更多