建立組件
預存程序或觸發程序之類的 Managed 資料庫物件會經過編譯,然後再稱為組件的單元中進行部署。 必須先在 SQL Server中註冊 Managed DLL 元件,才能使用元件所提供的功能。 若要在SQL Server資料庫中註冊元件,請使用 CREATE ASSEMBLY 語句。 本主題討論如何在資料庫中使用 CREATE ASSEMBLY 陳述式註冊組件,以及如何指定組件的安全性設定。
CREATE ASSEMBLY 陳述式
CREATE ASSEMBLY 陳述式用於在資料庫中註冊組件。 範例如下:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll';
FROM 子句會指定要建立之組件的路徑名稱。 此路徑可以是通用命名慣例 (UNC) 路徑,或是本機電腦的實體檔案路徑。
SQL Server 不允許註冊具有相同名稱、文化特性及公開金鑰之不同版本的組件。
您可以建立參考其他組件的組件。 在 SQL Server 中建立元件時,如果尚未在資料庫中建立參考的元件,則也會建立根層級元件所參考的元件。
資料庫使用者或使用者角色擁有建立並因而擁有資料庫中之組件的權限。 若要建立組件,資料庫使用者或角色應該擁有 CREATE ASSEMBLY 權限。
如果是下列狀況,組件只會成功參考其他組件:
呼叫或參考的組件是由相同的使用者或角色所擁有。
呼叫或參考的組件是在相同的資料庫中所建立。
建立組件時指定安全性
在SQL Server資料庫中建立元件時,您可以指定三種不同安全性層級的其中一個,其中一個可以執行程式碼: SAFE
、 EXTERNAL_ACCESS
或 UNSAFE
。 執行 CREATE ASSEMBLY
陳述式時,系統會在可能造成組件無法在伺服器上註冊的程式碼組件上執行某些檢查。 如需詳細資訊,請參閱 CodePlex上的模擬範例。
SAFE
是預設的權限集,而且適用於大部分的狀況。 若要指定給定的安全性層級,您要修改 CREATE ASSEMBLY 陳述式的語法,如下所示:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = SAFE;
只要省略上述程式碼的第三行,也可以建立包含 SAFE
權限集的組件:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll';
當組件中的程式碼在 SAFE
權限集下執行時,只能在伺服器內透過同處理序 Managed 提供者進行計算與資料存取。
建立 EXTERNAL_ACCESS 和 UNSAFE 組件
EXTERNAL_ACCESS
會處理程序碼需要存取伺服器外部資源的狀況,例如,檔案、網路、登錄和環境變數。 每當伺服器存取外部資源時,它會模擬呼叫 Managed 程式碼之使用者的安全性內容。
UNSAFE
程式碼許可權適用于元件無法驗證安全或需要額外存取受限制資源的情況,例如 Microsoft WIN32 API。
若要在 SQL Server 中建立 EXTERNAL_ACCESS
或 UNSAFE
元件,必須符合下列兩個條件之一:
組件是用強式名稱簽署,或用包含憑證的 Authenticode 簽署。 這個強式名稱 (或憑證) 是在SQL Server內建立為非對稱金鑰 (或憑證) ,且具有外部存取元件許可權 (的對應登入
EXTERNAL ACCESS ASSEMBLY
,) 或UNSAFE ASSEMBLY
不安全性群組件的許可權 () 。資料庫擁有者 (DBO) 具有
EXTERNAL ACCESS ASSEMBLY
元件EXTERNAL ACCESS
) 或UNSAFE ASSEMBLY
元件) 許可權的 (UNSAFE
(,且資料庫將 TRUSTWORTHY Database 屬性 設定為ON
。
以上列出的兩個條件也會在組件載入時間 (包括執行) 進行檢查。 若要載入組件,至少必須符合其中一個條件。
我們建議您不要將資料庫的 TRUSTWORTHY Database 屬性 設定為 ON
只執行伺服器進程中的 Common Language Runtime (CLR) 程式碼。 但是,建議從 master 資料庫的組件檔中建立非對稱金鑰。 接著,必須建立對應到此非對稱金鑰的登入,並授與登入 EXTERNAL ACCESS ASSEMBLY
或 UNSAFE ASSEMBLY
權限。
執行 CREATE ASSEMBLY 語句之前,先執行下列 Transact-SQL 語句。
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
注意
您必須建立一個新的登入,並和非對稱金鑰相關聯。 這個登入只會用來授與權限,並不需要和使用者相關聯,也不需要在應用程式中使用。
若要建立 EXTERNAL ACCESS
組件,建立者必須擁有 EXTERNAL ACCESS
權限。 這是在建立組件時指定的:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
執行 CREATE ASSEMBLY 語句之前,先執行下列 Transact-SQL 語句。
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 Integration Security。
另請參閱
管理 CLR 整合組件
變更組件
卸除組件
CLR 整合程式碼存取安全性
TRUSTWORTHY 資料庫屬性
允許部分信任的呼叫端