如何将数据从 SQL Server 审计文件加载到表中?

kum*_*mar 2 sql-server audit sql-server-2008-r2

我在 SQL Server 2008 R2 中启用了审计来监视 DML 和 DDL 操作。

有没有办法将 SQLAudit 文件加载到数据库?或者任何其他方法将审计详细信息直接自动加载到数据库?

Sco*_*red 6

以下过程对我们很有效。

我们将审计文件写入文件共享。我有一个专门用于处理这些审计文件的 Sql Server 实例。在这个 SQLAudit 实例上,我有一个每分钟运行一次并执行一个存储过程的作业。

存储过程:

  • 使用 Powershell任何审核文件(当前未写入)移动到暂存文件共享。powershell 命令使用 -ErrorAction SilentlyContinue 参数,该参数允许命令在复制到暂存文件共享时“跳过”当前正在写入的文件。最终,“锁定”文件将可以在未来的时间间隔内复制。
  • 现在我有可用的 SQLAudit 文件从暂存文件共享中读取,我们可以sys.fn_get_audit_file使用通配符处理暂存文件共享中的所有 SQLAudit 文件。
  • 从暂存文件共享中使用文件后,我使用 Powershell 从暂存文件共享中删除文件。

这是存储过程。

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

    EXEC xp_cmdshell 'powershell.exe "Move-Item \\FBPISILON01.sfbcic.com\SQLAuditLogs-SC\*.sqlaudit \\FBPISILON01.sfbcic.com\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('\\FBPISILON01.sfbcic.com\SQLAuditLogs-SC\SQLAuditLogs_Staging\*.*', DEFAULT, DEFAULT)
    WHERE server_principal_name NOT IN (
            ,'mfoperational'
            ,'mfreader'
            ,'aperioapplication'
            ,'aperioreader'
            ,'aperiosync'
            ,'aperiobuild'
            ,'DataFix'
            ,'mapinfo'
            ,'GeoSpatialUpdater'
            ,'sa'
            ,'ussql1'
            ,'usweb'
            ,'uswebs'
            ,'vmview'
            ,'dba-admin'
            )

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