CLR 整合概觀
適用於:SQL Server Azure SQL 受控執行個體
做為 Microsoft .NET Framework 核心的 Common Language Runtime (CLR),提供了所有 .NET Framework 程式碼的執行環境。 在 CLR 內執行的程式代碼稱為 Managed 程式代碼。 CLR 提供程式執行所需的各種功能及服務,包括 just-in-time (JIT) 編譯、配置及管理記憶體、強制使用型別安全性、例外處理、執行緒管理及安全性。 如需詳細資訊,請參閱 .NET Framework 開發指南。
注意
如需搭配 SQL Server 語言延伸模組使用新 .NET 的詳細資訊,請參閱 如何在 SQL Server 語言延伸模組中呼叫 .NET 運行時間。
透過裝載在 SQL Server 中的 CLR(稱為 CLR 整合),您可以在 Managed 程式代碼中撰寫預存程式、觸發程式、使用者定義函數、使用者定義型別和使用者定義的匯總。 由於 Managed 程式代碼在執行之前會編譯成機器碼,因此在某些情況下,您可以達到顯著的效能提升。
程式碼存取安全性
在 SQL Server 2016 (13.x) 和舊版中,程式代碼存取安全性 (CAS) 會防止元件執行特定作業。
CLR 使用 .NET Framework 中的程式碼存取安全性 (CAS),而這不再作為安全性界限受支援。 使用 建立的 PERMISSION_SET = SAFE
CLR 元件或許可以存取外部系統資源、呼叫 Unmanaged 程式代碼,以及取得系統管理員許可權。 在 SQL Server 2017 (14.x) 和更新版本中,sp_configure
clr strict 安全性選項可增強 CLR 元件的安全性。 clr strict security
會依預設啟用,且將 SAFE
與 EXTERNAL_ACCESS
組件視作已標記為 UNSAFE
一樣。 clr strict security
您可以停用此選項以提供回溯相容性,但不建議使用。
建議您使用已授與 UNSAFE ASSEMBLY
資料庫中許可權 master
的對應登入,以憑證或非對稱密鑰簽署所有元件。 SQL Server 系統管理員也可以將組件新增至資料庫引擎應該信任的組件清單。 如需詳細資訊,請參閱 sys.sp_add_trusted_assembly。
CLR 整合的優點
Transact-SQL 是針對資料庫中的直接數據存取和操作所設計。 雖然 Transact-SQL 擅長數據存取和管理,但這不是完整的程式設計語言。 例如,Transact-SQL 不支援陣列、集合、for-each 迴圈、位移位或類別。 雖然某些建構可以在 Transact-SQL 中模擬,但 Managed 程式代碼已整合這些建構的支援。 根據案例,這些功能可以提供在Managed程式碼中實作特定資料庫功能令人信服的理由。
Visual Basic 和 C# 提供面向物件功能,例如封裝、繼承和多型。 相關程式代碼現在可以輕鬆地組織成類別和命名空間。 當您使用大量的伺服器程式代碼時,這些功能可讓您更輕鬆地組織和維護程式碼。
Managed 程式代碼比 Transact-SQL 更適合用於計算和複雜的執行邏輯,而且具有許多複雜工作的廣泛支援,包括字串處理和正則表達式。 在 .NET Framework 連結庫中找到的功能,您可以存取數千個預先建置的類別和例程。 您可以從任何預存程式、觸發程式或使用者定義函式輕鬆存取這些類別。 基類庫 (BCL) 包含類別,這些類別提供字串操作、進階數學運算、檔案存取、密碼編譯等功能。
注意
雖然這些類別有許多可從 SQL Server 中的 CLR 程式代碼中使用,但不適合伺服器端使用的類別(例如視窗化類別),則無法使用。 如需詳細資訊,請參閱 支援的 .NET Framework 連結庫。
Managed 程式代碼的優點之一是類型安全性,或保證程式代碼只會以定義完善的允許方式存取類型。 在執行 Managed 程式代碼之前,CLR 會驗證程式代碼是否安全。 例如,會檢查程式代碼,以確保不會讀取先前未寫入的記憶體。 CLR 也可以協助確保程式碼不會操作 Unmanaged 記憶體。
CLR 整合提供改善效能的可能性。 如需詳細資訊,請參閱 CLR 整合架構的效能。
選擇 Transact-SQL 與 Managed 程式代碼
當您撰寫預存程式、觸發程式和使用者定義函式時,您必須決定要使用傳統 Transact-SQL,還是 .NET Framework 語言,例如 Visual Basic 或 C#。 當程式代碼大部分執行數據存取時,很少或沒有程式性邏輯時,請使用 Transact-SQL。 針對具有複雜邏輯的CPU密集函式和程式,或當您想要使用 .NET Framework 的 BCL 時,請使用 Managed 程式代碼。
在伺服器中選擇執行,以及在用戶端中執行
決定要使用 Transact-SQL 或 Managed 程式代碼的另一個因素是您希望程式代碼所在的位置、伺服器電腦或客戶端電腦。 Transact-SQL 和 Managed 程式代碼都可以在伺服器上執行。 這會將程式代碼和數據放在一起,並可讓您利用伺服器的處理能力。 另一方面,您可能想要避免將處理器密集型工作放在資料庫伺服器上。 現今大部分的用戶端電腦都很強大,您可能想要盡可能將程式代碼放在用戶端上,以利用此處理能力。 Managed 程式代碼可以在用戶端電腦上執行,而 Transact-SQL 則無法執行。
選擇擴充預存程式和Managed程式代碼
您可以建置擴充預存程式來執行 Transact-SQL 預存程式無法執行的功能。 不過,擴充預存程式可能會危害 SQL Server 進程的完整性,而驗證為類型安全的 Managed 程式代碼則無法。 此外,記憶體管理、線程和光纖的排程,以及同步處理服務在 CLR 和 SQL Server 的 Managed 程式代碼之間更深入整合。 透過 CLR 整合,您有比擴充預存程式更安全的方式,以撰寫您在 Transact-SQL 中無法執行工作所需的預存程式。 如需 CLR 整合和擴充預存程式的詳細資訊,請參閱 CLR 整合架構的效能。