審計由三層組成:服務器審計對象(定義輸出目標)→ 審計規範(定義審計動作/對象)→ 啟用審計。支持輸出到二進制文件、Windows 安全日志、應用程序日志。
USE master;
GO
CREATE SERVER AUDIT SrvAudit
TO FILE (
FILEPATH = 'C:\AuditLogs\', -- 目錄需存在,SQL Server 服務賬號需寫入權限
MAXSIZE = 100 MB, -- 單文件最大值
MAX_ROLLOVER_FILES = 10, -- 保留文件數,超過循環覆蓋
RESERVE_DISK_SPACE = ON -- 預分配空間,提升性能
)
WITH (
QUEUE_DELAY = 1000, -- 異步寫入延遲(ms),0=同步,>0=異步(性能優先)
ON_FAILURE = CONTINUE -- 寫入失敗策略:CONTINUE(繼續)/SHUTDOWN(關閉實例)
);
GO
CREATE SERVER AUDIT SPECIFICATION SrvAuditSpec
FOR SERVER AUDIT SrvAudit
ADD (FAILED_LOGIN_GROUP), -- 登錄失敗
ADD (SUCCESSFUL_LOGIN_GROUP), -- 登錄成功
ADD (DATABASE_ROLE_MEMBER_CHANGE_GROUP), -- 角色變更
ADD (SERVER_ROLE_MEMBER_CHANGE_GROUP); -- 服務器角色變更
GO
USE FinanceDB;
GO
CREATE DATABASE AUDIT SPECIFICATION DbAuditSpec
FOR SERVER AUDIT SrvAudit
ADD (SELECT, INSERT, UPDATE, DELETE ON SCHEMA::dbo BY public), -- 核心表增刪改查
ADD (EXECUTE ON DATABASE::FinanceDB BY public); -- 存儲過程執行
GO
ALTER SERVER AUDIT SrvAudit WITH (STATE = ON);
GO
ALTER SERVER AUDIT SPECIFICATION SrvAuditSpec WITH (STATE = ON);
GO
ALTER DATABASE AUDIT SPECIFICATION DbAuditSpec WITH (STATE = ON);
GO
SELECT event_time, action_id, succeeded,
server_principal_name, database_name,
object_name, statement
FROM sys.fn_get_audit_file('C:\AuditLogs\SrvAudit_*.sqlaudit', DEFAULT, DEFAULT)
WHERE event_time > DATEADD(HOUR, -24, GETDATE())
ORDER BY event_time DESC;
對象資源管理器 → 安全性 → 審計 → 右鍵「查看審計日志」,支持篩選、導出。
| 決策點 | 選項 A | 選項 B | 建議 |
|---|---|---|---|
| 輸出目標 | 文件 | Windows 日志 | 文件:易歸檔、可壓縮、跨平台分析;日志:集中化 SIEM 接入 |
| QUEUE_DELAY | 0 (同步) | 1000+ (異步) | 核心業務 0 保證不丟失;高頻操作 1000-3000 平衡性能 |
| ON_FAILURE | CONTINUE | SHUTDOWN | 生產通常 CONTINUE,配合監控告警;合規強要求 SHUTDOWN |
| MAXSIZE/ROLLOVER | 小文件多滾動 | 大文件少滾動 | 100MB/10-20 個,便於下載分析 |
sys.dm_server_audit_status 監控審計狀態,異常自動告警。