建立組件

適用於:SQL Server

預存程序或觸發程序之類的 Managed 資料庫物件會經過編譯,然後再稱為組件的單元中進行部署。 必須先在 Microsoft 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 中建立元件時,如果尚未將參考的元件建立到資料庫中,SQL Server也會建立根層級元件所參考的元件。

資料庫使用者或使用者角色擁有建立並因而擁有資料庫中之組件的權限。 若要建立組件,資料庫使用者或角色應該擁有 CREATE ASSEMBLY 權限。

如果是下列狀況,組件只會成功參考其他組件:

  • 呼叫或參考的組件是由相同的使用者或角色所擁有。

  • 呼叫或參考的組件是在相同的資料庫中所建立。

建立組件時指定安全性

在SQL Server資料庫中建立元件時,您可以指定程式碼可執行之三種不同層級的其中之一:SAFEEXTERNAL_ACCESSUNSAFE。 執行 CREATE ASSEMBLY 語句時,會在程式碼元件上執行某些檢查,這可能會導致元件無法在伺服器上註冊。

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 許可權集合下執行時,它只能透過進程受控提供者在伺服器內執行計算和資料存取。

建立 EXTERNAL_ACCESS 和 UNSAFE 組件

EXTERNAL_ACCESS 可解決程式碼需要存取伺服器外部資源的案例,例如檔案、網路、登錄和環境變數。 每當伺服器存取外部資源時,它會模擬呼叫 Managed 程式碼之使用者的安全性內容。

UNSAFE 程式碼許可權適用于元件無法驗證安全或需要額外存取受限制資源的情況,例如 Microsoft WIN32 API。

若要在 SQL Server 中建立EXTERNAL_ACCESSUNSAFE元件,必須符合下列兩個條件之一:

  1. 組件是用強式名稱簽署,或用包含憑證的 Authenticode 簽署。 這個強式名稱 (或憑證) 會在SQL Server內建立為非對稱金鑰 (或憑證) ,且具有外部存取元件) 或UNSAFE ASSEMBLY許可權 (的對應登入,) 或 UNSAFE ASSEMBLY許可權 (不安全性群組件) 。

  2. 資料庫擁有者 (DBO) 具有EXTERNAL ACCESS元件的EXTERNAL ACCESS ASSEMBLY () 或 UNSAFE ASSEMBLY (FOR UNSAFE元件) 許可權,且資料庫已將TRUSTWORTHY Database 屬性設定為ON

以上列出的兩個條件也會在組件載入時間 (包括執行) 進行檢查。 若要載入組件,至少必須符合其中一個條件。

我們建議您不要將資料庫的 TRUSTWORTHY Database 屬性 設定為 ON ,只在伺服器進程中執行 Common Language Runtime (CLR) 程式碼。 但是,建議從 master 資料庫的組件檔中建立非對稱金鑰。 接著必須建立對應至這個非對稱金鑰的登入,而且必須授與 EXTERNAL ACCESS ASSEMBLYUNSAFE ASSEMBLY 許可權。

下列 Transact-SQL 語句會執行建立非對稱金鑰所需的步驟、將登入對應至此金鑰,然後將 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 EXTERNAL ACCESS ASSEMBLY TO SQLCLRTestLogin;   
GO   

注意

您必須建立一個新的登入,並和非對稱金鑰相關聯。 這個登入只會用來授與權限,並不需要和使用者相關聯,也不需要在應用程式中使用。

若要建立 EXTERNAL ACCESS 元件,建立者必須具有 EXTERNAL ACCESS 許可權。 這是在建立組件時指定的:

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll'  
WITH PERMISSION_SET = EXTERNAL_ACCESS;  

下列 Transact-SQL 語句會執行建立非對稱金鑰所需的步驟、將登入對應至此金鑰,然後將 UNSAFE 許可權授與登入。 在執行 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 整合安全性

另請參閱

管理 CLR 整合組件
變更組件
卸除組件
CLR 整合程式碼存取安全性
TRUSTWORTHY 資料庫屬性