SQLCLR 程式碼在 SQL Server 內執行時,同時受兩套安全系統管控:
關鍵原則:SQL Server 權限管內部,CAS 管外部。即使擁有 sysadmin,CLR 程式碼若無 FileIOPermission 也無法讀寫磁碟檔案。
| PERMISSION_SET | CAS 權限 | 適用場景 | 風險 |
|---|---|---|---|
| SAFE (預設) | 僅允許運算、資料存取、內部邏輯,禁止存取外部資源 | 純計算、字串處理、資料轉換 | 最低 |
| EXTERNAL_ACCESS | 允許存取檔案、網路、登錄、其他資料庫 | 讀寫檔案、呼叫 Web Service、跨資料庫查詢 | 中等,需簽署強名稱/憑證 |
| UNSAFE | 完全信任,可呼叫 Unmanaged 程式碼、Win32 API、操作記憶體指標 | 極少數極度複雜互通場景 | 最高,可能導致 SQL Server 進程崩潰 |
SQL Server 作為 CLR 主機,透過 HostProtectionAttribute 禁止組件使用特定 .NET 功能:
Syncronization) → 防止死鎖影響排程器。SharedState) → 隔離 AppDomain。ExternalProcessMgmt) → 禁止 Process.Start。SelfAffectingProcessMgmt) → 禁止 Environment.Exit。UI) → 伺服器端無互動桌面。違反 HPA 的程式碼在載入時即會擲回 PolicyException。
SAFE,功能不足再提升至 EXTERNAL_ACCESS。EXTERNAL ACCESS ASSEMBLY / UNSAFE ASSEMBLY 權限。ThreadLocalStorage 或資料表暫存。BULK INSERT/bcp 或 SSIS,勿在 SQLCLR 迴圈讀寫檔案。