CREATE ASSEMBLY (Transact-SQL)
建立一個 Managed 應用程式模組,其中所包含的類別中繼資料和 Managed 程式碼是 SQL Server 執行個體中的一個物件。您可以參考這個模組,在資料庫中建立 Common Language Runtime (CLR) 函數、預存程序、觸發程序、使用者自訂的彙總以及使用者自訂類型。
語法
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 Sample>。
DECLARE @SamplesPath nvarchar(1024)
SELECT @SamplesPath = REPLACE(physical_name,
'Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\master.mdf',
'Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\')
FROM master.sys.database_files
WHERE name = 'master';
CREATE ASSEMBLY HelloWorld
FROM @SamplesPath + 'HelloWorld\CS\HelloWorld\bin\debug\HelloWorld.dll'
WITH PERMISSION_SET = SAFE;