公共語言運行庫 (CLR) 是 Microsoft .NET Framework 的核心,爲所有 .NET Framework 代碼提供執行環境。在 CLR 中運行的代碼稱爲託管代碼。CLR 提供執行程序所需的各種函數和服務,包括實時 (JIT) 編譯、分配和管理內存、強制類型安全性、異常處理、線程管理和安全性。
通過在 Microsoft SQL Server 中託管 CLR(稱爲 CLR 集成),可以在託管代碼中編寫存儲過程、觸發器、用戶定義函數、用戶定義類型和用戶定義聚合函數。因爲託管代碼在執行之前會編譯爲本機代碼,所以,在有些方案中可以大大提高性能。
託管代碼使用代碼訪問安全性 (CAS)、代碼鏈接和應用程序域來阻止程序集執行某些操作。SQL Server 2005 使用 CAS 幫助保證託管代碼的安全,並避免操作系統或數據庫服務器受到威脅。
一、部署和編譯CLR集成
CLR集成功能在system.data.dll的程序集中公開,該程序集是.Net Framework的一部分,在全局程序集緩存(GAC)以及.Net Framework中可以找到它。
System.data.dll程序集包括以下命名空間,這些命名空間是編譯CLR數據庫所必須的:
System.Data; System.Data.Sql; Microsoft.SqlServer.Server; System.Data.SqlTypes.
1、編寫一個類文件,以helloWord.cs實現存儲過程爲例,
編寫文件名爲helloWord.cs的類文件,實現在SQL中“Hello world!20080102”輸出,其代碼如下:
using System;
using System.Data;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
public class HelloWorldProc
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void HelloWorld()
{
SqlContext.Pipe.Send("Hello World!/n20080102/n");
}
}
2、編譯上述“helloWord”存儲過程
運行cmd.exe,在.NET Framework的安裝路徑下,使用 /target 選項啓動 Visual C# 或 Visual Basic 編譯器,以指定生成一個庫 DLL。例如編譯保存在E盤根目錄下的“helloWord.cs”,
則執行語句如下:
C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727>csc /target:library e:/helloWord.cs
如下圖所示:
編譯成功後,系統將在.Net Framework的安裝路徑下,創建一個名爲helloWord.dll的庫。
二、在SQL Server中運行CLR
1、在SQL Server中啓用CLR
默認情況下,Microsoft SQL Server 中禁用公共語言運行庫 (CLR) 集成功能,必須啓用才能使用通過 CLR 集成實現的對象。
通過系統存儲過程“SP_Configure”啓用CLR:
EXEC SP_CONFIGURE 'clr enabled',1
GO
RECONFIGURE
GO
2、在SQL Server中加載和運行上述“helloWord”存儲過程
在“helloWord”存儲過程編譯成功後,通過“CREATE ASSEMBLY”創建名稱爲“helloword”的程序集,SQL語句如下:
CREATE ASSEMBLY helloword from 'C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/helloWord.dll'
WITH PERMISSION_SET=SAFE
注:
SQL Server主機策略級權限集有三種:
(1) SAFE:只允許內部計算和本地數據訪問。SAFE是強制性最強的權限集。通過具有SAFE權限的程序集執行的代碼無法訪問外部系統資源,例如文件、網絡、環境變量或註冊表。
(2) EXTERNAL_ACCESS:與SAFE權限集類似,但是可以訪問外部系統資源,例如文件、網絡、環境變量和註冊表。
(3) UNSAFE:允許程序集對資源進行不受限制的訪問,無論在SQL SERVER內部還是外部,從UNSAFE程序集中執行的代碼可以調用非託管代碼。
在“helloword”程序集創建成功後,通過“CREATE PROCEDURE”創建名稱爲“hello”的存儲過程來訪問“helloWord”方法,SQL語句如下:
CREATE PROCEDURE hello
AS
EXTERNAL NAME helloword.HelloWorldProc.HelloWorld
在“hello”存儲過程創建成功後,運行“EXEC hello”,系統將SQL Server Management Studio 消息窗口中輸出如下信息:
Hello World!
20080102
2、從測試數據庫中刪除剛纔創建的“helloWord”存儲過程示例
DROP PROCEDURE hello --刪除存儲過程
GO
DROP ASSEMBLY helloword --刪除程序集
GO