Sql Server - 如何将审计日志转换为表?

zer*_*law 3 sql-server audit standard-edition

我使用的是 Sql Server 2014 标准版。我的目标是跟踪对表的操作历史(插入、更新、删除),并显示在网络上,以便用户能够知道过去数据发生了什么。

因此,我开始知道 Sql Server 标准版中部分支持审计功能,并且能够记录一些操作,如附件所示。

在此处输入图片说明

我的问题是,如何将这些日志存储在适当的 Sql 表中,以便可以在网页上访问、检索和显示这些记录?

目前,允许的审计目标:文件、安全日志、应用程序日志......似乎无法直接从 ASP.NET API 检索。

是否可以登录到 SQL 表?

PS:

(如果我错了,请纠正我)。许多人说标准版只允许服务器级审计,但不允许数据库级审计。但是,由于一些未知的原因,如果我添加了这 7 种审计类型(是的,7 种或无),我就能够捕获和查看数据库级别的操作。

在此处输入图片说明

spa*_*dba 5

捕获单个表上的 DML 操作是标准版中不可用的审计功能之一。

如果您想跟踪 DML 操作,另一个可能的钩子是扩展事件。您将无法使用审计包,但您可以使用锁定获取事件来捕获读取和写入操作。

我在这里写了博客:https : //spaghettidba.com/2015/04/20/tracking-table-usage-and-identifying-unused-objects/

其他选项是:

  • 触发器:这很容易设置,甚至可以通过生成触发器代码自动设置。缺点是写入开销增加。
  • 应用程序端日志记录:如果您可以控制应用程序,则可以注入记录对表的访问所需的代码。


Sco*_*red 5

我使用以下技术来捕获审核日志并将其存储在表中。也许您可以根据您的需要进行调整。我们实际上使用企业版,因此​​我们可能能够捕获比标准版更多的内容。

  • 配置您的审计以写入文件系统并将最大大小限制为 10mb 等。当满足该大小时,这将强制创建新的审核文件。我们使用共享文件夹是因为我们有多个服务器写入审核信息,并且我们使用在单独服务器上运行的一个捕获进程。

  • 创建一个存储过程(示例如下),该过程将使用sys.fn_get_audit_file. 创建一个代理作业来定期运行捕获存储过程(我们每分钟运行一次)。

  • 存储过程使用 Powershell 将审核文件从主存储文件夹“移动”到“暂存”文件夹。我们绕过审核进程仍在写入的“锁定”文件,并将在下一个捕获周期中拾取它们。存储过程使用读取审计文件sys.fn_get_audit_file并将信息插入到历史表中。您还可以包含一个WHERE子句来限制从审核文件中选择的信息。然后,我们再次调用 Powershell 来删除“暂存”审核文件。

这是存储过程:

CREATE PROCEDURE [dbo].[SqlAuditCaptureAuditLogs]
AS
BEGIN
    SET XACT_ABORT ON

    EXEC xp_cmdshell 'powershell.exe "Move-Item \\<SharedFolder>\SQLAuditLogs-SC\*.sqlaudit \\<SharedFolder>\SQLAuditLogs-SC\SQLAuditLogs_Staging -ErrorAction SilentlyContinue"'
        ,no_output

    INSERT INTO SQLAUDIT.[dbo].[SQLAUDIT_HISTORY] (
        event_time
        ,sequence_number
        ,action_id
        ,server_principal_name
        ,server_instance_name
        ,database_name
        ,schema_name
        ,object_name
        ,statement
        )
    SELECT event_time
        ,sequence_number
        ,action_id
        ,server_principal_name
        ,server_instance_name
        ,database_name
        ,schema_name
        ,object_name
        ,statement
    FROM sys.fn_get_audit_file('<SharedFolder\SQLAuditLogs-SC\SQLAuditLogs_Staging\*.*', DEFAULT, DEFAULT)

    EXEC xp_cmdshell 'powershell.exe "Remove-Item \\<SharedFolder>\SQLAuditLogs-SC\SQLAuditLogs_Staging\*.* -ErrorAction SilentlyContinue"'
        ,no_output
END
Run Code Online (Sandbox Code Playgroud)