sqlserver創建程序集
適用對象: SQL Server
Azure SQL 數據庫
Azure SQL 數據倉庫
並行數據倉庫
托管數據庫對象(如存儲過程或觸發器)先經過編譯,然后部署到稱為程序集的單元中。 托管的 DLL 程序集必須在注冊MicrosoftSQL Server才能使用該程序集提供的功能。 若要在 SQL Server 數據庫中注冊程序集,請使用 CREATE ASSEMBLY 語句。 本主題討論如何使用 CREATE ASSEMBLY 語句在數據庫中注冊程序集,以及如何為程序集指定安全設置。
CREATE ASSEMBLY 語句
CREATE ASSEMBLY 語句用於在數據庫中創建程序集。 以下是示例:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll';
FROM 子句指定要創建的程序集的路徑名。 此路徑既可以是通用命名約定 (UNC) 路徑,也可以是計算機本地的物理文件路徑。
SQL Server 不允許使用相同的名稱、區域性和公鑰來注冊程序集的不同版本。
可以創建引用其他程序集的程序集。 當在 SQL Server 中創建程序集時,SQL Server 還將創建由根級別程序集引用的程序集(如果尚未在數據庫中創建被引用程序集)。
將向數據庫用戶或用戶角色授予在數據庫中創建進而擁有程序集的權限。 為了創建程序集,數據庫用戶或角色應具有 CREATE ASSEMBLY 權限。
僅當滿足以下條件時,程序集才能成功地引用其他程序集:
-
所調用或被引用的程序集由同一個用戶或角色所有。
-
所調用或被引用的程序集是在同一個數據庫中創建的。
創建程序集時指定安全性
創建程序集時SQL Server數據庫,可以指定三個不同的代碼可以在其中運行的安全級別之一:安全, EXTERNAL_ACCESS,或UNSAFE。 當CREATE ASSEMBLY運行語句時,可能會導致無法在服務器上注冊的程序集對代碼程序集上執行某些檢查。 有關詳細信息,請參閱 》 上模擬示例CodePlex。
安全是默認權限集,適用於大多數方案。 若要指定給定的安全級別,您可以按如下所示修改 CREATE ASSEMBLY 語句的語法:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = SAFE;
還有可能創建具有的程序集安全權限集通過只省略上述代碼的第三行:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll';
當程序集中的代碼下運行時安全權限設置,它只可以執行計算和通過進程內托管提供程序服務器內的數據訪問。
創建 EXTERNAL_ACCESS 和 UNSAFE 程序集
EXTERNAL_ACCESS解決了該代碼需要訪問服務器,例如文件、 網絡、 注冊表和環境變量以外的資源的方案。 只要服務器訪問外部資源,它就會模擬調用托管代碼的用戶的安全上下文。
不安全代碼權限是用於這些情況下,程序集不是可驗證為安全或要求進一步訪問受限資源,如MicrosoftWin32 API。
若要創建EXTERNAL_ACCESS或UNSAFE中的程序集SQL Server,必須滿足以下兩個條件之一:
-
程序集經過了強名稱簽名或使用證書進行了 Authenticode 簽名。 此強名稱 (或證書) 內創建SQL Server作為非對稱密鑰 (或證書),並且具有與相應的登錄名EXTERNAL ACCESS ASSEMBLY權限 (對於外部訪問程序集) 或UNSAFE ASSEMBLY權限 (對於不安全的程序集)。
-
數據庫所有者 (DBO) 擁有EXTERNAL ACCESS ASSEMBLY (對於外部訪問程序集) 或UNSAFE ASSEMBLY (對於UNSAFE程序集) 的權限,並且數據庫已TRUSTWORTHY 數據庫屬性設置為ON。
期待您的反饋 :如果在本文中發現過時或不正確的內容(如步驟或代碼示例),請告訴我們。 可以單擊此頁底部的“反饋” 部分中的“本頁” 按鈕。 我們通常在第二天閱讀有關 SQL 的每項反饋。 謝謝。
在加載程序集(包括執行)時,也將檢查上面所列的兩個條件。 至少必須滿足這些條件之一才能加載程序集。
我們建議TRUSTWORTHY 數據庫屬性在數據庫上不是設置為ON僅將運行公共語言運行時 (CLR) 代碼,在服務器進程中。 而是建議在 master 數據庫中通過程序集文件創建非對稱密鑰。 然后,必須創建映射到此非對稱密鑰的登錄名,並且必須授予該登錄名EXTERNAL ACCESS ASSEMBLY或UNSAFE ASSEMBLY權限。
以下Transact-SQL語句將執行創建非對稱密鑰,將登錄名映射到此密鑰,然后授予所需的步驟EXTERNAL_ACCESS到登錄名的權限。 必須運行以下 Transact-SQL 語句,然后才能運行 CREATE ASSEMBLY 語句。
USE master;
GO
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll'
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey
GRANT EXTERNAL ACCESS ASSEMBLY TO SQLCLRTestLogin;
GO
備注
必須創建新的登錄名以與非對稱密鑰關聯。 此登錄名僅用於授予權限;不必與用戶關聯或在應用程序中使用。
若要創建外部訪問程序集,創建者需要具有外部訪問權限。 此權限在創建程序集時指定:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
以下Transact-SQL語句將執行創建非對稱密鑰,將登錄名映射到此密鑰,然后授予所需的步驟UNSAFE到登錄名的權限。 必須運行以下 Transact-SQL 語句,然后才能運行 CREATE ASSEMBLY 語句。
USE master;
GO
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll';
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey ;
GRANT UNSAFE ASSEMBLY TO SQLCLRTestLogin ;
GO
指定程序集加載與UNSAFE權限,則指定UNSAFE時程序集加載到服務器權限集:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = UNSAFE;
有關每個設置的權限的更多詳細信息,請參閱CLR 集成安全性。
請參閱
管理 CLR 集成程序集
更改程序集
刪除程序集
CLR 集成代碼訪問安全性
TRUSTWORTHY 數據庫屬性
允許部分可信任的調用方