SQL Server 2005+ 內建 CLR (Common Language Runtime),讓開發者能以 C#/VB.NET 撰寫預存程序、觸發器、函數、型別、彙總等資料庫物件。本文為系列首篇,建立完整認知框架:為何需要 CLR、效能如何、安全機制、適用場景判斷。
CLR 核心價值
- 托管執行環境:JIT 編譯、記憶體管理、型別安全、例外處理、執行緒管理、代碼存取安全 (CAS)
- 語言豐富度:陣列、集合、泛型、LINQ、異步、完整 BCL,超越 T-SQL 程式能力
- 安全替代方案:取代非托管擴展預存程序 (xp_cmdshell 等),進程隔離更可靠
- 開發一體化:Visual Studio 統一開發調試資料庫與應用層代碼
- 擴展資料模型:UDT/UDA 突破關聯模型限制
T-SQL vs CLR:選擇決策矩陣
| 場景 | 推薦 | 理由 |
| 純資料存取/簡單邏輯 | T-SQL | 集合運算原生優化、網路傳輸最小 |
| 複雜運算/字串處理/演算法 | CLR | 編譯執行效率高、BCL 豐富 |
| 需 .NET Framework 功能 (正則、加密、IO、Web Service) | CLR | T-SQL 無對應能力 |
| 大量資料迴圈/遊標替代 | CLR | 陣列/List 效能遠優於遊標 |
| 自訂彙總/複雜型別 | CLR | UDA/UDT 獨有能力 |
部署位置考量:伺服器端 vs 用戶端
- 伺服器端 (CLR/T-SQL):資料就地計算、利用伺服器算力、減少網路傳輸
- 用戶端:避免佔用資料庫 CPU、利用分散式用戶端算力
- 原則:資料密集型 → 伺服器;計算密集且非核心 → 考慮用戶端
CLR vs 擴展預存程序 (XP)
| 維度 | 擴展預存程序 | SQL CLR |
| 記憶體/執行緒管理 | 自行管理,易洩漏/衝突 | CLR 統一管理,與 SQLOS 整合 |
| 型別安全 | 無 | 完整型別安全 |
| 進程穩定性風險 | 高 (崩潰影響主進程) | 低 (AppDomain 隔離) |
| 除錯支援 | 困難 | VS 整合除錯 |
| 部署 | DLL 複製 + sp_addextendedproc | CREATE ASSEMBLY + 權限模型 |
效能特性對照表
| 物件類型 | T-SQL 優勢 | CLR 優勢 |
| 使用者定義函數 | 資料存取密集型 | 程序邏輯、計算、字串操作、無資料存取 |
| 使用者定義彙總 | 非遊標內建彙總 | 遊標基礎彙總、複雜自訂邏輯 |
| 資料流表值函數 (TVF) | — | 優於擴展預存程序,回傳 IEnumerable |
| 陣列 vs 遊標 | 遊標效能低 | 陣列/List 高效遍歷 |
| 字串資料 | char/varchar 原生 | SqlString/SqlChars 處理複雜邏輯 |
| 擴展預存程序替代 | 資源不可控 | 可監測執行緒資源使用 |
SQL CLR 安全模型:三層權限集
結合 SQL Server 使用者權限與 CLR 代碼存取安全 (CAS):
| 權限集 | 能力 | 限制 | 連線字串 |
| SAFE (預設) | 內部計算、本地資料存取 | 不可存取檔案/網路/註冊表/環境變數 | 僅 context connection=true |
| EXTERNAL_ACCESS | SAFE + 外部資源存取 | 不可非受控記憶體/執行緒操作 | 標準連線字串 |
| UNSAFE | 完全信任 (FullTrust) | 可任意非受控操作,風險極高 | 無限制 |
關鍵機制
EXTERNAL_ACCESS 組件預設以 SQL Server 服務帳戶 執行
- 可透過
SqlContext.WindowsIdentity.Impersonate() 模擬呼叫者 Windows 身份
- 資料庫屬性
TRUSTWORTHY ON + 擁有者為 sa + 組件簽署/非對稱金鑰 → 授權 EXTERNAL_ACCESS
- 預設拒絕非授權外部存取,保護伺服器完整性
實戰應用場景預覽
- 跨資料庫/跨伺服器資料同步 (Linked Server + CLR)
- 整合外部 Web Service (SharePoint、ERP、CRM)
- 複雜報表計算、加密/解密、檔案處理
- 自訂彙總函數 (中位數、去重計數、統計分析)
- 結構化資料型別 (幾何、貨幣、版本號)
系列規劃
- 本文:架構原理、效能、安全模型
- 第二篇:VS 開發六大物件類型完整實作
- 第三篇:除錯技巧、常見錯誤、手動部署腳本
- 第四篇:實戰專案 — 同步 SQL Server 與 SharePoint List
總結
SQL CLR 不是取代 T-SQL,而是為T-SQL 無法勝任的計算密集、外部整合、複雜型別場景提供強大補完。理解三層權限模型 (SAFE/EXTERNAL_ACCESS/UNSAFE) 與部署鏈路,是安全落地的前提。