SQLCLR 引入 .NET 執行環境至 SQL Server 進程內,引發 DBA 擔憂:開發人員程式碼擁有完整 .NET Framework 與 Win32 API 存取權,可能威脅資料完整性與伺服器穩定性。微軟透過分層防禦化解:
| 保護範疇 | 負責機制 | 保護對象 |
|---|---|---|
| 資料庫物件與資料存取 | SQL Server 安全模型 (登入/使用者/角色/權限) | 資料表、視圖、預存程序、資料列 |
| 外部資源存取 (檔案、登錄、網路、其他 DB、Web Service) | CLR 代碼存取安全性 (CAS) | 作業系統層面資源 |
| CLR 執行行為 (執行緒、記憶體、UI、進程控制) | 主機保護屬性 (HPA) | SQL Server 進程穩定性 |

SecurityPermission(Execution) + 內部資料存取,無任何外部權限。FileIOPermission, SocketPermission, RegistryPermission, SqlClientPermission 等外部存取權限。FullTrust,可呼叫 Unmanaged 程式碼、操作指標、P/Invoke。SQL Server 透過 HostProtectionResource 列舉禁止組件使用:
Synchronization (lock, Monitor) → 改用 SQL Server 鎖機制。SharedState (static 可變欄位) → 改用資料表或 ThreadLocalStorage。ExternalProcessMgmt (Process.Start) → 禁止啟動外部程式。SelfAffectingProcessMgmt (Environment.Exit) → 禁止終止進程。UI (MessageBox, Form) → 伺服器無互動桌面。MayLeakOnAbort (不可靠資源) → 需在 finally 確實釋放。CREATE ASYMMETRIC KEY KeyName FROM EXECUTABLE FILE = 'path\Assembly.dll'CREATE LOGIN ClrLogin FROM ASYMMETRIC KEY KeyNameGRANT EXTERNAL ACCESS ASSEMBLY TO ClrLogin 或 UNSAFE ASSEMBLY。CREATE ASSEMBLY AssemblyName FROM 'path\Assembly.dll' WITH PERMISSION_SET = EXTERNAL_ACCESScontext connection 簡化交易管理。IDisposable 並 using 區塊釋放。