【问题标题】:How to setup trigger based audit? [duplicate]如何设置基于触发器的审计? [复制]
【发布时间】:2020-10-26 03:51:38
【问题描述】:

我有一张桌子Employee:

CREATE TABLE [dbo].[Employee]
(
    [EmployeeCode] [int] NOT NULL,
    [FirstName] [varchar](50) NULL,
    [LastName] [varchar](50) NULL,
    [Email] [varchar](50) NULL,
    [Position] [varchar](30) NULL
)

每当Employee 表中的Position(连同Old Position、New Position 和Timestamp)发生变化时,我都想记录Employee_Audit 表中的变化。

CREATE TABLE [dbo].[Employee_Audit]
(
    [EmployeeCode] [int] NOT NULL,
    [FirstName] [varchar](50) NULL,
    [LastName] [varchar](50) NULL,
    [Email] [varchar](50) NULL,
    [PositionOld] [varchar](30) NULL,
    [PositionNew] [varchar](30) NULL,
    [Date] [datetime] NULL
 )

我如何做到这一点?

【问题讨论】:

  • 有很多方法可以做到这一点,您的研究向您展示了什么?

标签: sql sql-server tsql ssms ssms-2012


【解决方案1】:

您基本上需要一个 UPDATE 触发器来检查 Position 值是否已更改 - 如果是,请将详细信息记录到 Employee_Audit:

CREATE OR REPLACE trgEmployeeUpdate
ON dbo.Employee 
AFTER UPDATE 
AS
BEGIN
    -- based on the Inserted and Deleted pseudo tables, join the rows
    -- that were updated and look for changes in "Position"
    INSERT INTO dbo.Employee_Audit (EmployeeCode, FirstName, LastName, Email, 
                                    PositionOld, PositionNew, [Date])
        SELECT
            i.EmployeeCode, i.FirstName, i.LastName, i.Email,
            d.Position, i.Position, SYSDATETIME()
        FROM
            Inserted i
        INNER JOIN
            Deleted d ON i.EmployeeCode = d.EmployeeCode
        WHERE
            i.Position <> d.Position    -- Position has changed
END

【讨论】:

  • 谢谢@marc_s。这解决了我的查询。 :-)
【解决方案2】:

除了提到的触发选项@marc_s,如果您不想只考虑位置,并考虑所有列更改审计,以下选项为您提供审计,无需任何特定的编程需求。您可以查看它是否适合您的需求。

【讨论】:

  • 谢谢@Venkataraman R。虽然我选择了触发选项,但您的回答也很有帮助。 :-)
猜你喜欢
  • 2016-10-19
  • 2010-11-10
  • 1970-01-01
  • 2013-02-13
  • 2020-01-08
  • 1970-01-01
  • 2017-03-25
  • 2014-04-19
相关资源
最近更新 更多