SQL CLR

SQL CLR

SQL CLR (SQL Common Language Runtime) 是自 SQL Server 2005 才出現的新功能,它將.NET Framework中的CLR服務注入到 SQL Server 中,讓 SQL Server 的部分資料庫對象可以使用 .NET Framework 的程式語言開發(目前只支持VB.NETC#),包括預存程式、用戶自定義函式觸發程式、用戶自定義類型以及用戶自定義匯總函式等功能。

基本介紹

  • 中文名:SQL CLR
  • 外文名:SQL Common Language Runtime
  • 領域:計算機編程
架構,安全性,示例,

架構

SQL CLR 是利用 .NET Framework 中的Hosting(裝載)特性所實現的版本,這個功能讓 SQL Server 中可以安裝 .NET Framework 的組件,經由實現 ADO.NET 2.0 中所開放的Microsoft.SqlServer.Server名字空間中的.NET中介數據,來獲得 SQL Server 資料庫對象的能力:
  • 預存程式:SqlProcedureAttribute。
  • 用戶函式:SqlFunctionAttribute。
  • 觸發程式:SqlTriggerAttribute。
  • 用戶自定義匯總:SqlUserDefinedAggregate。
  • 用戶自定義類型:SqlUserDefinedType。
SQL CLR 的組件在發展完成後,需要使用CREATE ASSEMBLY指令將組件安裝到 SQL Server 中,然後使用相對應的 DDL 指令將組件中開放的函式引入資料庫對象中,才能在 SQL 指令中調用。
CREATE ASSEMBLY SQLCLRTestFROM 'C:\MyDBApp\SQLCLRTest.dll'WITH PERMISSION_SET = SAFE

安全性

對於 SQL Server 來說,SQL CLR 組件是一種外部代碼,所以在 SQL Server 默認的安裝配置中,SQL CLR 是被封鎖不可以使用的,若要使用它,必須要先將它打開:
EXEC sp_configure 'clr enabled', 1;
而對於 SQL CLR 組件本身,SQL Server 也做了三重的防護:
  • SAFE:只有最少的許可權可以運行,不可訪問外部資源與外部代碼。
  • EXTERNAL_ACCESS:可以訪問外部資源,像是檔案、登錄資料庫、網路資源等。
  • UNSAFE:可以無限制的訪問外部資源,連 Win32 API 等都可以調用。
在大多數的情況來說,使用 SAFE 即可以正常使用組件,除非是要訪問外部檔案才使用 EXTERNAL_ACCESS,只有在特殊的情況下(例如要調用外部的商業邏輯組件)時,才會激活 UNSAFE 層次。

示例

下列示例為使用 C# 開發 SQL Server 用戶函式的代碼:
[Microsoft.SqlServer.Server.SqlFunction]public static SqlString HashPasswordString(SqlString HashString){    SHA384Managed hashAlgorithm = new SHA384Managed();    byte[] srcPassword = System.Text.Encoding.ASCII.GetBytes(HashString.Value);    byte[] destPassword = null;    string hashedPasswordString = null;    destPassword = hashAlgorithm.ComputeHash(srcPassword);    hashedPasswordString = System.Text.Encoding.ASCII.GetString(destPassword);    hashAlgorithm = null;    return new SqlString(hashedPasswordString);}
將組件安裝到 SQL Server 的腳本為:
CREATE ASSEMBLY MyAssemblyLibrary FROM 'MySQLCLR.dll' WITH PERMISSION_SET = SAFE
將此函式引入 SQL Server 中的 DDL 腳本為:
CREATE FUNCTION dbo.HashPassword(   @PasswordString varchar(4000))RETURNS varchar(4000)EXTERNAL NAME [MyAssemblyLibrary]。[MySQLCLR]。[HashPasswordString]
安裝並引入後,即可如一般的 SQL 函式方式使用:
SELECT dbo.HashPassword('mypassword') 

相關詞條

熱門詞條

聯絡我們