Sql-Server
如何從 SQL Server 審計文件將數據載入到表中?
我在 SQL Server 2008 R2 中啟用了審計來監控 DML 和 DDL 操作。
有沒有辦法將 SQLAudit 文件載入到數據庫中?或者任何其他自動將審計細節直接載入到數據庫的方法?
以下過程對我們來說效果很好。
我們將審計文件寫入文件共享。我有一個專門用於處理這些審計文件的 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