SQL Server 2016审计功能

时间:2016-10-05 06:48:12

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

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

通常我已经实现了这个,例如with Triggers获取此信息并存储到AUDIT表。

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

1 个答案:

答案 0 :(得分:0)

您可以使用触发器跟踪数据库表上的数据更改 您可以在参考教程

中找到如何log sql table data changes using triggers的示例

在这里,您需要知道,如果应用程序的用户映射到数据库上的单个用户,则必须在UPDATE,DELETE或INSERT命令中明确地将用户信息插入,更新或删除作为表字段值。否则,您获得的将是所有交易的同一用户

就像t emporal 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

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

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

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