SQL Server數據庫托管代碼的使用詳解
SQL Server數據庫托管代碼的使用是本文我們主要要介紹的內容,我們知道,SQL Server是一個非托管的應用程序,但是開發人員可以用托管代碼創建數據庫存儲過程、觸發器或者函數。這樣開發人員就可以利用其他語言來編寫數據庫存儲過程、觸發器或者函數,不僅可以使用FCL或其他程序集中的類型,還可以享受.net framerwork中強大類庫的功能。
當***請求一個用托管代碼寫的存儲過程時, MSSQL會加載CLR,存儲過程會在獨立的應用程序域運行,這樣不會對數據庫本身產生影響。托管代碼會被JIT編譯成本地代碼執行,而不是解釋執行,這保證了托管代碼的執行效率。
編寫托管代碼
為了使用托管代碼創建數據庫存儲過程、觸發器或者函數,只需要對托管代碼中具體方法使用Microsoft.SqlServer.Server命名空間下的特性:[SqlProcedure]、[SqlFunction]或者[SqlTrigger]。當然方法的參數和返回值相應會有一定的限制。
比如寫一個隨機散列算法的方法,聲明成MSSQL的存儲過程:
- GetHashText方法
- namespace Wuhong.ClrSp
- {
- public class StoredProcedures
- {
- [Microsoft.SqlServer.Server.SqlProcedure]
- public static void GetHashText(string plainText, out string encryptedText, ref int hashProvider, ref string saltText)
- {
- //方法體略……
- }
- }
- }
至此,可以利用托管代碼完成一切數據庫腳本所無法完成的功能。
特別的,托管代碼中也可以訪問當前的數據庫,但與普通方法訪問數據庫有兩處不同:
一是連接字符串要使用上下文鏈接(Context Connection),"context connection=true"。這表示代碼中的數據庫上下文跟托管代碼調用方的數據庫上下文一致。
二是將結果集、消息或命令執行結果發送回客戶端時需要通過數據庫上下文專門的管道對象SqlContext.Pipe來發送。
開啟CLR集成
默認情況下, CLR集成功能在MSSQL中處于禁用狀態。若要使用 SQL CLR 項目項,必須啟用 CLR 集成。
- sp_configure
- sp_configure 'clr enabled',1
- GO
- RECONFIGURE
- GO
創建程序集
生成托管代碼程序集后,需要在MSSQL中創建相應的托管應用程序模塊,將其作為MSSQL實例中的對象。通過引用此模塊,可在數據庫中創建CLR函數、存儲過程、觸發器。
創建ASSEMBLY
- CREATE ASSEMBLY [Wuhong.ClrSp]
- FROM 'F:\website\Wuhong.ClrSp.dll'
- WITH PERMISSION_SET = SAFE;
WITH PERMISSION_SET指定MSSQL向程序集授予的一組代碼訪問權限。SAFE是默認值。
SAFE 是***限制性的權限集。由具有 SAFE 權限的程序集所執行的代碼將無法訪問外部系統資源,例如文件、網絡、環境變量或注冊表。
EXTERNAL_ACCESS 使程序集可以訪問某些外部系統資源,例如文件、網絡、環境變量以及注冊表。UNSAFE 可使程序集不受限制地訪問資源,無論是MSSQL實例內部還是外部的資源都可以訪問。從 UNSAFE 程序集內運行的代碼可調用未托管代碼。
創建托管應用程序集的操作也可以在MSSQL Management Studio中手工完成。
創建存儲過程
下面是根據創建的托管模塊來創建存儲過程。
創建PROCEDURE
- CREATE PROCEDURE [dbo].[GetHashText]
- @plainText [nvarchar](4000),
- @encryptedText [nvarchar](4000) OUTPUT,
- @hashProvider [int] OUTPUT,
- @saltText [nvarchar](4000) OUTPUT
- WITH EXECUTE AS CALLER
- AS
- EXTERNAL NAME [Wuhong.ClrSp].[StoredProcedures].[GetHashText]
- GO
WITH EXECUTE AS指定執行模塊的上下文,可以控制 數據庫引擎使用哪一個用戶帳戶來驗證對模塊引用的對象的權限。CALLER是默認值。
CALLER指定模塊內的語句在模塊調用方的上下文中執行。這表示執行模塊的用戶不僅必須對模塊本身擁有適當的權限,還要對模塊引用的任何數據庫對象擁有適當權限。
OWNER指定模塊內的語句在模塊的當前所有者上下文中執行。
SELF指定模塊內的語句在創建或更改模塊的用戶的上下文中執行。
'user_name'指定模塊內的語句在user_name指定的用戶的上下文中執行。
關于SQL Server數據庫中托管代碼的使用方法就介紹到這里了,希望本次的介紹能夠對您有所收獲!
【編輯推薦】