【问题标题】:SQL Server 2016 audit capabilitiesSQL Server 2016 审计功能
【发布时间】:2017-02-13 11:54:23
【问题描述】:

我有一个典型的 Web 应用程序,非常基于 CRUD。当某些表或列发生变化时,我们需要存储有关它的历史信息。这可以例如是一个包含新/旧列值、时间戳、它所关联的表、更改它的用户名等的 AUDIT 表。

通常我已经实现了这个,例如使用触发器来获取此信息并存储到 AUDIT 表中。

但是,这是否可以通过 SQL Server 2016 审计功能自动实现?我想到了几个问题: 1) 是否能够将审计数据存储在数据库表中,如上面带有触发器的示例? 2) 是否允许应用程序读取数据,或者访问审计数据是否需要一些特殊的管理员凭据? 3) 是否可以指定需要记录哪些信息,或者该功能是否自动记录所有内容?

【问题讨论】:

  • 这些数据的目的是审计还是历史?对于历史,您可能需要考虑新的时态表功能,如果合适的话。
  • 我认为历史和审计是一回事。关键点是1)我们可能需要能够定义表结构,2)应用程序页面需要能够查询审计/临时表
  • 对于历史表,Damien 提供的最佳方法是在 SQL Server 2016 上使用临时表 kodyaz.com/sql-server-2016/…。不幸的是,这些表没有导致更改的用户名

标签: sql-server audit sql-server-2016 audit-trail


【解决方案1】:

您可以使用触发器来跟踪数据库表上的数据更改 您可以在参考教程中找到如何log sql table data changes using triggers 的示例

在这里您需要知道,如果您的应用程序的用户映射到数据库上的单个用户,您将必须在您的 UPDATE、DELETE 或 INSERT 命令中显式地传递 insertby、updateby 或 deletedby 用户信息作为表字段值。否则,您将获得所有交易的同一用户

就像 temporal tables on SQL Server 2016 一样,您需要手动使用或创建历史表或日志表

请检查以下SQL触发代码

CREATE TRIGGER dbo.LogTbl
    ON dbo.Tbl
AFTER INSERT, UPDATE, DELETE
AS

IF EXISTS (
  SELECT * FROM Inserted
) -- INSERT or UPDATE
BEGIN
    IF EXISTS (
      SELECT * FROM Deleted
    )
  -- UPDATE Statement was executed
  INSERT INTO HistoryTbl (
    ...
    UpdatedDate,
    UpdatedByUserId
  )
  SELECT
    ...
    i.UpdatedDate,
    i.UpdatedByUserId
  FROM Deleted d
  INNER JOIN Inserted i ON i.Id = d.Id

  ELSE
  -- INSERT Statement was executed
  INSERT INTO HistoryTbl (
    ...
    InsertedDate,
    InsertedByUserId
  )
  SELECT
    ...
    i.InsertedDate,
    i.InsertedByUserId
  FROM Inserted i

END
ELSE
  -- DELETE Statement was executed
  INSERT INTO HistoryTbl (
    ...
    DeletedDate,
    DeletedByUserId
  )
  SELECT
    GETDATE(),  ---!!!
    USER_ID()   ---!!!
  FROM Deleted

GO

注意DELETE命令,在delete命令中我们没有删除用户数据。所以我用了USER_ID(),你也可以用USER_NAME()

另一种方法是,您可以通过将 ACTIVE 列值更新为 false 来删除它,而不是删除一行。我的意思是更新数据,如果你把它的活动字段设置为0,可以认为它被删除了。

因此,您必须通过仅选择活动数据来修改所有代码...

【讨论】:

  • 是的,触发器是一种方法,我以前用过,但现在我想知道我们是否可以使用 SQL Server 2016 的功能来实现这种开箱即用的功能?触发器会导致各种性能问题和混乱......
猜你喜欢
  • 1970-01-01
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
相关资源
最近更新 更多