共用方式為


建立元件

適用於:SQL Server

Managed 資料庫物件,例如預存程式或觸發程式,會編譯,然後部署在稱為元件的單位中。 Managed DLL 元件必須先在 SQL 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 資料庫中建立元件時,您可以指定程式代碼可執行的三種不同層級其中之一: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 程式代碼許可權適用於元件無法驗證安全或需要其他存取受限制資源的情況,例如 Win32 API。

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

  1. 元件是強名稱簽署或以憑證簽署的 Authenticode。 此強名稱(或憑證)會在 SQL Server 內建立為非對稱密鑰(或憑證),並具有具有 EXTERNAL ACCESS ASSEMBLY 許可權的對應登入(適用於外部存取元件)或 UNSAFE ASSEMBLY 許可權(適用於不安全的元件)。

  2. 資料庫擁有者 (DBO) 具有 EXTERNAL ACCESS ASSEMBLY(適用於 EXTERNAL ACCESS 元件)或 UNSAFE ASSEMBLY(適用於 UNSAFE 元件)許可權,且資料庫具有 TRUSTWORTHY 資料庫屬性, 設定為 ON

先前列出的兩個條件也會在元件載入時間檢查(包括執行)。 至少必須符合其中一個條件,才能載入元件。

建議資料庫上的 TRUSTWORTHY 資料庫屬性 未設定為 ON 只在伺服器進程中執行 Common Language Runtime (CLR) 程式代碼。 相反地,我們建議從 master 資料庫中的元件檔建立非對稱密鑰。 接著必須建立對應至這個非對稱密鑰的登入,而且必須授與登入 EXTERNAL ACCESS ASSEMBLYUNSAFE 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 整合安全性