使用SQL Server的CLR集成

公共語言運行庫 (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

 
發佈了22 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章