SQL CLR (SQL Common Language Runtime) 是自 SQL Server 2005 才出現(xiàn)的新功能,它將.NET Framework中的CLR服務(wù)注入到 SQL Server 中,讓 SQL Server 的部分?jǐn)?shù)據(jù)庫(kù)對(duì)象可以使用 .NET Framework 的編程語(yǔ)言開(kāi)發(fā)(目前只支持VB.NET和C#),包括預(yù)存程序、用戶(hù)自定義函數(shù)、觸發(fā)程序、用戶(hù)自定義類(lèi)型以及用戶(hù)自定義匯總函數(shù)等功能。
架構(gòu)SQL CLR 是利用 .NET Framework 中的**Hosting(裝載)**特性所實(shí)現(xiàn)的版本,這個(gè)功能讓 SQL Server 中可以安裝 .NET Framework 的組件,經(jīng)由實(shí)現(xiàn) ADO.NET 2.0 中所開(kāi)放的Microsoft.SqlServer.Server名字空間中的.NET中介數(shù)據(jù),來(lái)獲得 SQL Server 數(shù)據(jù)庫(kù)對(duì)象的能力:
預(yù)存程序:SqlProcedureAttribute。
用戶(hù)函數(shù):SqlFunctionAttribute。
觸發(fā)程序:SqlTriggerAttribute。
用戶(hù)自定義匯總:SqlUserDefinedAggregate。
用戶(hù)自定義類(lèi)型:SqlUserDefinedType。
SQL CLR 的組件在發(fā)展完成后,需要使用CREATE ASSEMBLY指令將組件安裝到 SQL Server 中,然后使用相對(duì)應(yīng)的 DDL 指令將組件中開(kāi)放的函數(shù)引入數(shù)據(jù)庫(kù)對(duì)象中,才能在 SQL 指令中調(diào)用。1
CREATE ASSEMBLY SQLCLRTestFROM 'C:\MyDBApp\SQLCLRTest.dll'WITH PERMISSION_SET = SAFE安全性對(duì)于 SQL Server 來(lái)說(shuō),SQL CLR 組件是一種外部代碼,所以在 SQL Server 默認(rèn)的安裝配置中,SQL CLR 是被封鎖不可以使用的,若要使用它,必須要先將它打開(kāi):
EXEC sp_configure 'clr enabled', 1;而對(duì)于 SQL CLR 組件本身,SQL Server 也做了三重的防護(hù):
SAFE:只有最少的權(quán)限可以運(yùn)行,不可訪問(wèn)外部資源與外部代碼。
EXTERNAL_ACCESS:可以訪問(wèn)外部資源,像是文件、登錄數(shù)據(jù)庫(kù)、網(wǎng)絡(luò)資源等。
UNSAFE:可以無(wú)限制的訪問(wèn)外部資源,連 Win32 API 等都可以調(diào)用。
在大多數(shù)的情況來(lái)說(shuō),使用 SAFE 即可以正常使用組件,除非是要訪問(wèn)外部文件才使用 EXTERNAL_ACCESS,只有在特殊的情況下(例如要調(diào)用外部的商業(yè)邏輯組件)時(shí),才會(huì)激活 UNSAFE 層次。2
示例下列示例為使用 C# 開(kāi)發(fā) SQL Server 用戶(hù)函數(shù)的代碼:
[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將此函數(shù)引入 SQL Server 中的 DDL 腳本為:
CREATE FUNCTION dbo.HashPassword( @PasswordString varchar(4000))RETURNS varchar(4000)EXTERNAL NAME [MyAssemblyLibrary]。[MySQLCLR]。[HashPasswordString]安裝并引入后,即可如一般的 SQL 函數(shù)方式使用:
SELECT dbo.HashPassword('mypassword') 本詞條內(nèi)容貢獻(xiàn)者為:
王慧維 - 副研究員 - 西南大學(xué)