CREATE ASSEMBLY (Transact-SQL)

建立一個 Managed 應用程式模組,其中所包含的類別中繼資料和 Managed 程式碼是 SQL Server 執行個體中的一個物件。 您可以參考這個模組,在資料庫中建立 Common Language Runtime (CLR) 函數、預存程序、觸發程序、使用者定義彙總以及使用者定義型別。

主題連結圖示 Transact-SQL 語法慣例

語法

CREATE ASSEMBLY assembly_name
[ AUTHORIZATION owner_name ]
FROM { <client_assembly_specifier> | <assembly_bits> [ ,...n ] }
[ WITH PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } ]
[ ; ]
<client_assembly_specifier> :: = 
        '[\\computer_name\]share_name\[path\]manifest_file_name'
  | '[local_path\]manifest_file_name' 

<assembly_bits> :: =
{ varbinary_literal | varbinary_expression }

引數

  • assembly_name
    這是組件的名稱。 這個名稱在資料庫中必須是唯一名稱,而且是有效的識別碼

  • AUTHORIZATION owner_name
    指定身為組件擁有者的使用者或角色的名稱。 owner_name 必須是目前使用者所屬的角色名稱,或者目前使用者必須具有 owner_name 的 IMPERSONATE 權限。 若未指定,擁有權便歸目前使用者。

  • <client_assembly_specifier>
    指定正在上傳之組件所在的本機路徑或網路位置,以及對應於該組件的資訊清單檔案名稱。 <client_assembly_specifier> 可以用變數表示為固定字串或評估為固定字串的運算式。 CREATE ASSEMBLY 不支援載入多模組組件。 SQL Server 也會在同一個位置尋找這個組件的任何相依組件,同時以同一位擁有者做為根層級組件來上傳它們。 如果找不到這些相依組件,而且它們也尚未載入目前資料庫,CREATE ASSEMBLY 便會失敗。 如果相依組件已經載入到目前資料庫中,則那些組件的擁有者,必須與剛建立組件的擁有者一樣。

    如果登入的使用者正被模擬,就不能指定 <client_assembly_specifier>。

  • <assembly_bits>
    這是構成組件及其相依組件的二進位值清單。 清單中的第一個值,被視為根層級組件。 對應於相依組件的值,可以採用任何順序提供。 任何不對應於根組件相依性的值,則略過不管。

    [!附註]

    自主資料庫無法使用這個選項。

  • varbinary_literal
    這是一個 varbinary 常值。

  • varbinary_expression
    這是 varbinary 類型的運算式。

  • PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE }
    當 SQL Server 存取組件時,指定一組授與組件的程式碼存取權限。 若未指定,便採用 SAFE 作為預設值。

    我們建議您使用 SAFE。 SAFE 是最有限的權限集合。 具有 SAFE 權限的組件所執行的程式碼,不能存取外部系統資源,例如,檔案、網路、環境變數或登錄。

    EXTERNAL_ACCESS 可讓組件存取特定的外部系統資源,例如,檔案、網路、環境變數和登錄。

    [!附註]

    自主資料庫無法使用這個選項。

    UNSAFE 可讓組件無限制地存取 SQL Server 執行個體內外的資源。 從 UNSAFE 組件內執行的程式碼,可以呼叫 Unmanaged 程式碼。

    [!附註]

    自主資料庫無法使用這個選項。

    安全性注意事項安全性注意事項

    對於執行計算和資料管理工作,而不存取 SQL Server 執行個體外之資源的組件,建議您採用 SAFE 做為權限設定。

    對於存取 SQL Server 執行個體外之資源的組件,我們建議您使用 EXTERNAL_ACCESS。 EXTERNAL_ACCESS 組件包含 SAFE 組件的可靠性和延展性保護,但是從安全性的角度看來,卻與 UNSAFE 組件很相似。 這是因為 EXTERNAL_ACCESS 組件中的程式碼,依預設是以 SQL Server 服務帳戶執行,並且以該帳戶存取外部資源,除非程式碼明確模擬呼叫者。 因此,建立 EXTERNAL_ACCESS 組件的權限,只能授與可以 SQL Server 服務帳戶來執行程式碼的可靠登入。 如需有關模擬的詳細資訊,請參閱<CLR 整合安全性>。

    指定 UNSAFE 可讓組件中的程式碼,在 SQL Server 處理序空間執行可能會犧牲 SQL Server 效能的作業。 UNSAFE 組件也可能會破壞 SQL Server 或 Common Language Runtime 的安全性系統。 UNSAFE 權限應該只授與受到高度信任的組件。 只有系統管理員 (sysadmin) 固定伺服器角色的成員,才能夠建立及變更 UNSAFE 組件。

    如需有關組件權限集合的詳細資訊,請參閱<設計組件>。

備註

CREATE ASSEMBLY 會上傳之前從 Managed 程式碼編譯為 .dll 檔、用於 SQL Server 執行個體內部的組件。

SQL Server 不允許註冊具有相同名稱、文化特性及公開金鑰之不同版本的組件。

當您試圖存取 <client_assembly_specifier> 中所指定的組件時,SQL Server 會模擬目前 Windows 登入的安全性內容。 由於委派限制之故,如果 <client_assembly_specifier> 指定網路位置 (UNC 路徑),目前登入的模擬並不會在網路位置發揮作用。 此時就得利用 SQL Server 服務帳戶的安全性內容來完成存取作業。 如需詳細資訊,請參閱<認證 (Database Engine)>。

除了 assembly_name 所指定的根組件之外,SQL Server 還會上傳任何正在上傳之根組件所參考的組件。 如果因為之前 CREATE ASSEMBLY 陳述式的關係,所參考的組件已經上傳到資料庫了,就不會上傳這個組件,但是根組件仍然能夠使用它。 如果之前相依組件並未上傳,但是 SQL Server 在來源目錄找不到其資訊清單檔,CREATE ASSEMBLY 便會傳回錯誤。

如果由根組件參考的任何相依組件尚未在資料庫中,而且以隱含方式與根組件一起載入,則它們的權限集合與根層級組件相同。 如果相依組件必須以與根層級組件不同的權限集合加以建立,必須利用適當的權限集合,在根層級組件之前明確上傳。

組件驗證

SQL Server 會在 CREATE ASSEMBLY 陳述式上傳的組件二進位執行檢查,來保證下列各項:

  • 組件二進位具有有效的中繼資料和程式碼區段,格式良好,而且程式碼區段也具有有效的 Microsoft 中繼語言 (MSIL) 指示。

  • 它所參考的系統組件集,是下列其中一個 SQL Server 支援的組件:Microsoft.Visualbasic.dll、Mscorlib.dll、System.Data.dll、System.dll、System.Xml.dll、Microsoft.Visualc.dll、Custommarshallers.dll、System.Security.dll、System.Web.Services.dll、System.Data.SqlXml.dll、System.Core.dll 和 System.Xml.Linq.dll。 也可以參考其他系統組件,但是它們必須在資料庫中明確註冊。

  • 以 SAFE 或 EXTERNAL ACCESS 權限集合加以建立的組件:

    • 組件程式碼應該是類型安全的程式碼。 類型安全性是藉由對組件執行 Common Language Runtime 驗證器而完成的。

    • 除非被標示為唯讀,否則組件的類別不應包含任何靜態資料成員。

    • 組件的類別不能包含 finalizer 方法。

    • 組件的類別或方法只能以允許的程式碼屬性加以註解。 如需詳細資訊,請參閱<CLR 常式的自訂屬性>。

除了之前在 CREATE ASSEMBLY 執行時所執行的檢查之外,在執行組件程式碼時,還會執行其他檢查:

  • 如果組件的權限集合不含特定程式碼存取權限,則可能無法呼叫某些必須具備該權限的 Microsoft .NET Framework API。

  • 如果是 SAFE 和 EXTERNAL_ACCESS 組件,則完全無法呼叫以特定 HostProtectionAttributes 加以註解的 .NET Framework API。

如需詳細資訊,請參閱<設計組件>。

權限

需要 CREATE ASSEMBLY 權限。

如果指定 PERMISSION_SET = EXTERNAL_ACCESS,則 SQL Server 登入必須具有伺服器的 EXTERNAL ACCESS ASSEMBLY 權限。 如果指定 PERMISSION_SET = UNSAFE,則需要系統管理員 (sysadmin) 固定伺服器角色中的成員資格。

如果任何由即將上傳之組件所參考的組件已經在資料庫中,則使用者必須是這些組件的擁有者才行。 若要利用檔案路徑來上傳組件,則目前使用者必須是 Windows 驗證的登入,或是系統管理員 (sysadmin) 固定伺服器角色的成員。 執行 CREATE ASSEMBLY 的使用者 Windows 登入,必須具有共用區以及正在載入陳述式中之檔案的讀取權限。

如需有關組件權限集合的詳細資訊,請參閱<設計組件>。

範例

下列範例假設 SQL Server Database Engine 範例是安裝在機電腦的預設位置,而且 HelloWorld.csproj 範例應用程式已經編譯。 如需詳細資訊,請參閱<Hello World 範例>。

CREATE ASSEMBLY HelloWorld 
FROM <system_drive>:\Program Files\Microsoft SQL Server\100\Samples\HelloWorld\CS\HelloWorld\bin\debug\HelloWorld.dll
WITH PERMISSION_SET = SAFE;

請參閱

參考

ALTER ASSEMBLY (Transact-SQL)

DROP ASSEMBLY (Transact-SQL)

CREATE FUNCTION (Transact-SQL)

CREATE PROCEDURE (Transact-SQL)

CREATE TRIGGER (Transact-SQL)

CREATE TYPE (Transact-SQL)

CREATE AGGREGATE (Transact-SQL)

EVENTDATA (Transact-SQL)

概念

Common Language Runtime (CLR) 整合的使用案例和範例