當加密邏輯以 .NET 實作且需在 SQL Server 內解密時,CLR 整合 是最佳橋樑。本文完整示範:建立 C# 類別庫、簽署/部署組件、啟用 CLR、建立 T-SQL 包裝函數、實際呼叫驗證的端到端流程。
using System;
using System.Web; // 需參考 System.Web.dll
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
namespace MyDll
{
public partial class MyClass
{
[SqlMethod(IsDeterministic = true, IsPrecise = true)]
public static SqlString UrlDecode(string value)
{
if (value == null) return SqlString.Null;
return new SqlString(HttpUtility.UrlDecode(value));
}
}
}
C:\CLR\MyDll.dll)。-- 1. 啟用 CLR 整合 (需 sysadmin)
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'clr enabled', 1; RECONFIGURE;
GO
-- 2. 設定資料庫 TRUSTWORTHY (簡化權限,或改用非對稱金鑰/憑證授權)
ALTER DATABASE YourDB SET TRUSTWORTHY ON;
GO
-- 3. 部署相依組件 (此處為 System.Web)
CREATE ASSEMBLY [System.Web]
FROM 'C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll'
WITH PERMISSION_SET = UNSAFE;
GO
-- 4. 部署自訂組件
CREATE ASSEMBLY SQL_CLR_Url
FROM 'C:\CLR\MyDll.dll'
WITH PERMISSION_SET = UNSAFE;
GO
| PERMISSION_SET | 適用場景 |
|---|---|
| SAFE | 純運算、無外部存取、無非受控程式碼 |
| EXTERNAL_ACCESS | 需存取檔案、網路、登錄等外部資源 |
| UNSAFE | 呼叫非受控 API、反射、靜態變數、System.Web 等 |
注意: UNSAFE 需 TRUSTWORTHY ON 或非對稱金鑰授權,生產環境建議使用簽署金鑰方式而非 TRUSTWORTHY。
CREATE FUNCTION dbo.SqlUrlDecode(@urlstr NVARCHAR(4000))
RETURNS NVARCHAR(4000)
AS EXTERNAL NAME SQL_CLR_Url.[MyDll.MyClass].UrlDecode;
GO
命名規則: 組件名稱.[命名空間.類別名稱].方法名稱
SELECT dbo.SqlUrlDecode(Name) FROM UserTable WHERE Id = 1;
-- 回傳 URL 解碼後的字串
| 錯誤 | 原因 | 解決 |
|---|---|---|
| Assembly 'System.Web' not found | 相依組件未部署 | 先部署 System.Web 等相依組件 |
| CLR execution failed | C# 例外未捕獲 | 加入 try-catch 回傳 SqlString.Null 或錯誤訊息 |
| Permission denied | PERMISSION_SET 不足 | 改用 UNSAFE 或簽署非對稱金鑰授權 |
| Version mismatch | .NET Framework 版本不符 | 確認 SQL Server 支援的 CLR 版本 (2012/2014/2016/2017/2019 支援 4.x) |
ALTER ASSEMBLY SQL_CLR_Url FROM 'C:\CLR\MyDll_v2.dll'DROP FUNCTION dbo.SqlUrlDecode; DROP ASSEMBLY SQL_CLR_Url; DROP ASSEMBLY [System.Web];sys.assemblies、sys.assembly_modules 確認部署狀態。CLR 整合讓 SQL Server 能無縫復用 .NET 生態系的豐富函式庫,解決跨平台加密/解密/編碼互通難題,是混合技術棧環境的關鍵整合點。