建立組件
適用於: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 子句會指定要建立之元件的 pathname。 此路徑可以是通用命名約定 (UNC) 路徑或本機計算機的實體檔案路徑。
SQL Server 不允許註冊具有相同名稱、文化特性及公開金鑰之不同版本的組件。
可以建立參考其他元件的元件。 在 SQL Server 中建立元件時,如果尚未將參考的元件建立至資料庫,SQL Server 也會建立根層級元件所參考的元件。
資料庫使用者或使用者角色獲授與建立許可權,因而擁有資料庫中的元件。 若要建立元件,資料庫使用者或角色應該具有 CREATE ASSEMBLY 許可權。
如果下列情況,元件只能成功參考其他元件:
呼叫或參考的元件是由相同的使用者或角色所擁有。
呼叫或參考的元件是在相同的資料庫中建立的。
指定建立元件時的安全性
在 SQL Server 資料庫中建立元件時,您可以指定程式代碼可執行的三種不同層級其中之一: SAFE、 EXTERNAL_ACCESS或 UNSAFE。 執行 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_ACCESS 或 UNSAFE 元件,必須符合下列兩個條件之一:
元件是強名稱簽署或以憑證簽署的 Authenticode。 這個強名稱(或憑證)會在 SQL Server 內建立為非對稱密鑰(或憑證),並且具有具有 EXTERNAL ACCESS ASSEMBLY 許可權的對應登入(適用於外部存取元件)或 UNSAFE ASSEMBLY 許可權(適用於不安全的元件)。
資料庫擁有者 (DBO) 具有 EXTERNAL ACCESS ASSEMBLY(適用於 EXTERNAL ACCESS 元件)或 UNSAFE ASSEMBLY(適用於 UNSAFE 元件)許可權,且資料庫已將 TRUSTWORTHY Database 屬性設定為 ON。
上述兩個條件也會在元件載入時間檢查(包括執行)。 至少必須符合其中一個條件,才能載入元件。
我們建議您不要 將資料庫的 TRUSTWORTHY 資料庫屬性 設定為 ON ,只在伺服器進程中執行 Common Language Runtime (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
注意
您必須建立新的登入,才能與非對稱密鑰產生關聯。 此登入僅用於授與許可權;它不一定與使用者相關聯,也不需要在應用程式內使用。
若要建立 EXTERNAL ACCESS 元件,建立者必須具有 EXTERNAL ACCESS 許可權。 這會在建立元件時指定:
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 整合安全性。