SQL Server 2008 引入的策略管理,將「期望狀態配置」思想引入數據庫治理。通過方面-條件-策略三層模型,DBA 可聲明式定義實例、數據庫、對象的合規標準,並選擇四種評估模式實現從事後審計到事前阻斷的全譜系管控。
核心概念模型
| 概念 | 角色 | 關鍵特性 |
| 方面 | 管控目標對象 | 系統預定義(Server、Database、Table、Index、StoredProcedure、Login 等),不可擴展,僅暴露可檢查屬性 |
| 條件 | 布爾表達式判斷 | 對方面屬性進行邏輯組合(如 `@IsAnsiNullsEnabled = True AND @DataSpace != 'PRIMARY'`),支持巢狀邏輯 |
| 策略 | 條件+評估模式 | 綁定一個條件,指定四種評估模式之一,可跨實例/組部署 |
四種評估模式深度解析
1. 按需 - 手動審計
- 用戶在 SSMS 右鍵策略 →「評估」觸發;
- 適用:定期巡檢、變更前驗證、一次性合規報告;
- 結果:綠勾/紅叉列表,可導出 XML/HTML 報告。
2. 按計劃 - 定時掃描
- SQL Server Agent 作業定期運行(默認每天凌晨);
- 違規記錄寫入 `msdb.dbo.syspolicy_policy_execution_history`;
- 適用:非關鍵合規項(命名規範、填充因子、自動收縮關閉等);
- 注意:需啟用 Agent 服務,作業名稱格式 `syspolicy_purge_history_`。
3. 更改時:記錄 - 事件通知異步審計
- DDL 觸發器捕獲 `CREATE/ALTER/DROP` 事件 → Service Broker 異步評估策略;
- 違規記錄寫入歷史表,**不阻斷操作**;
- 適用:需要審計軌跡但允許例外的場景(如臨時調整 MAXDOP)。
4. 更改時:禁止 - DDL 觸發器同步阻斷
- DDL 觸發器同步評估策略,違規直接拋錯回滾事務;
- **最強管控模式**,適用:核心安全底線(禁用 SA、強制加密、禁止 `AUTO_SHRINK`、強制備份加密);
- 副作用:可能阻斷合法維護操作,需謹慎測試後啟用。
實戰案例:強制所有用戶表啟用頁壓縮
步驟 1:創建條件
-- 方面:Table
-- 表達式:@DataCompression = 'PAGE' OR @DataCompression = 'ROW'
-- 命名:CK_Table_Compression_Enabled
步驟 2:創建策略
-- 綁定條件 CK_Table_Compression_Enabled
-- 評估模式:按計劃(每日掃描)或 更改時:記錄(DDL 審計)
-- 目標:所有用戶數據庫的所有表
步驟 3:驗證與修復
-- 手動評估查看違規列表
-- 違規表執行:ALTER TABLE ... REBUILD WITH (DATA_COMPRESSION = PAGE);
跨實例部署:中心化管理
- 在中央管理服務器(CMS)註冊目標實例組;
- 右鍵策略 →「導出」為 XML 文件;
- 在 CMS 「策略管理」→「導入」策略,勾選目標組;
- 統一配置評估模式、計劃時間、通知操作員。
關鍵限制與最佳實踐
- 方面不可擴展:無法直接檢查自定義屬性(如擴展屬性),需通過條件調用系統函數間接實現;
- 性能影響:「更改時:禁止」會增加 DDL 執行延遲,核心對象(大表重建)慎用;
- 系統數據庫:`master`、`msdb`、`model` 默認不受管控,需顯式納入;
- 版本兼容:SQL 2008+ 支持,低版本實例不可作為目標;
- 權限要求:創建策略需 `PolicyAdministratorRole`(msdb),評估需對象 `VIEW DEFINITION` 權限。
總結
策略管理將「部落格式口頭規範」轉化為「可執行、可審計、可自動化」的治理代碼。建議採用分級管控策略:核心安全底線用「更改時:禁止」,性能最佳實踐用「按計劃」,命名規範用「按需/記錄」,構建從事前預防到事後追溯的全生命週期合規體系。