SQL Server 2008 將審計功能提升為一級伺服器物件,甚至能審計 SELECT 查詢——這在舊版本中需倚賴 SQL 追蹤或第三方工具。雖然圖形介面適合初學與小規模任務,但重複操作顯得繁瑣。本文透過 T-SQL 指令完整示範如何建立審計,並以檔案系統儲存審計記錄,適用於需審計多張資料表的情境。
首先在 master 資料庫建立伺服器層級的審計物件,指定輸出路徑:
USE master;
CREATE SERVER AUDIT testAudit TO FILE (FILEPATH = 'C:\TempSelectAudit');
GO
此物件負責蒐集伺服器/資料庫層級的動作與動作群組,屬實例級別。若單一伺服器運行多個實例,每個實例皆需建立獨立審計物件。
在目標資料庫(範例使用 AdventureWorks)建立審計規格,關聯上述伺服器審計,並新增審計動作——針對 HumanResources.Employee 資料表的 SELECT 操作,由 Public 角色執行:
USE AdventureWorks;
GO
CREATE DATABASE AUDIT SPECIFICATION testAudSpec
FOR SERVER AUDIT testAudit
ADD (SELECT ON HumanResources.Employee BY Public);
GO
可依需求新增多個動作/動作群組,亦可建立伺服器審計規格以審計登入失敗、角色變更等伺服器層級事件。完整動作清單請參閱線上叢書或 MSDN。
預設新建的審計物件與規格均為停用狀態,需手動啟用。可查詢系統檢視確認狀態(is_state_enabled = 1 表示啟用):
USE master;
SELECT is_state_enabled, * FROM sys.server_file_audits;
USE AdventureWorks;
SELECT is_state_enabled, * FROM sys.database_audit_specifications;
GO
啟用指令:
USE master;
ALTER SERVER AUDIT testAudit WITH (STATE = ON);
GO
USE AdventureWorks;
ALTER DATABASE AUDIT SPECIFICATION testAudSpec WITH (STATE = ON);
GO
透過 fn_get_audit_file 函數讀取審計檔案。因檔名含時間戳記,使用萬用字元 * 讀取目錄下所有審計檔:
SELECT session_server_principal_name, statement, *
FROM fn_get_audit_file ('C:\TempSelectAudit\*', NULL, NULL);
若已知確切檔名路徑,亦可指定單一檔案讀取。


圖:審計記錄查詢結果示例