CREATE ASSEMBLY (Transact-SQL)
適用於:SQL Server Azure SQL 受控執行個體
建立一個受控應用程式模組,其中所包含的類別中繼資料和受控碼是 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必須是目前用戶所屬角色的名稱,或目前用戶必須具有IMPERSONATE
owner_name的許可權。 若未指定,擁有權便歸目前使用者。
<client_assembly_specifier>
指定正在上傳之組件所在的本機路徑或網路位置,以及對應於該組件的資訊清單檔案名稱。 <client_assembly_specifier>
可以使用變數,以固定字串或評估為固定字串的表達式來表示。 CREATE ASSEMBLY
不支援載入多模組元件。 SQL Server 也會在同一個位置尋找這個組件的任何相依組件,同時使用與根層級組件相同的擁有者來上傳這些組件。 如果找不到這些相依元件,而且它們尚未載入目前資料庫中,則 CREATE ASSEMBLY
失敗。 如果相依組件已經載入到目前資料庫中,則那些組件的擁有者,必須與剛建立組件的擁有者一樣。
重要
Azure SQL 資料庫 & Azure SQL 受控執行個體 不支援從檔案建立元件。
<client_assembly_specifier>
如果登入的使用者正在模擬,則無法指定 。
<assembly_bits>
組成元件及其相依元件的二進位值清單。 清單中的第一個值,被視為根層級組件。 對應於相依組件的值,可以採用任何順序提供。 忽略任何未對應至根元件相依性的值。
注意
自主資料庫中無法使用此選項。
varbinary_literal
varbinary 常值。
varbinary_expression
varbinary 類型的表達式。
PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE }
指定 SQL Server 存取時授與元件的一組程式代碼存取許可權。 如果未指定, SAFE
則會套用為預設值。
選項 PERMISSION_SET
會受到 伺服器組態的影響:clr strict 安全性 選項。 當 clr strict security
已啟用時,所有組件會被視為 UNSAFE
。
建議使用 SAFE
。 SAFE
是最嚴格的許可權集合。 具有 SAFE
許可權的元件所執行的程式代碼無法存取外部系統資源,例如檔案、網路、環境變數或登錄。
EXTERNAL_ACCESS
可讓元件存取特定外部系統資源,例如檔案、網路、環境變數和登錄。
UNSAFE
可讓元件不受限制地存取 SQL Server 實例內外的資源。 從元件內 UNSAFE
執行的程式代碼可以呼叫 Unmanaged 程式代碼。
SAFE
是元件的建議許可權設定,這些元件會執行計算和數據管理工作,而不需要存取 SQL Server 實例以外的資源。
注意
自主 EXTERNAL_ACCESS
資料庫中無法使用 和 UNSAFE
選項。
我們建議針對存取 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
許可權應該只授與高度信任的元件。 只有系統管理員固定伺服器角色的成員可以建立和改變UNSAFE
元件。
如需元件許可權集合的詳細資訊,請參閱 設計元件。
不再支援程式碼存取安全性
CLR 使用 .NET Framework 中的程式碼存取安全性 (CAS),而這不再作為安全性界限受支援。 使用 PERMISSION_SET = SAFE
所建立的 CLR 組件可以存取外部系統資源、呼叫非受控程式碼,以及取得系統管理員權限。 在 SQL Server 2017 (14.x) 和更新版本中,sp_configure
安全性選項可增強 CLR 嚴格安全性。 clr strict security
會依預設啟用,且將 SAFE
與 EXTERNAL_ACCESS
組件視作已標記為 UNSAFE
一樣。 可以基於回溯相容性而停用 clr strict security
選項,但不建議這麼做。
我們建議透過具有已獲授與資料庫中 UNSAFE ASSEMBLY
權限master
之對應登入的憑證或非對稱金鑰簽署所有組件。 SQL Server 系統管理員也可以將組件新增至資料庫引擎應該信任的組件清單。 如需詳細資訊,請參閱 sys.sp_add_trusted_assembly。
備註
CREATE ASSEMBLY
上傳先前從 Managed 程式代碼編譯為.dll檔案的元件,以在 SQL Server 實例內使用。
啟用時,會在執行階段忽略 CREATE ASSEMBLY
和 ALTER ASSEMBLY
陳述式中的 PERMISSION_SET
選項,但在中繼資料中會保留 PERMISSION_SET
選項。 忽略 選項會將中斷現有的程式代碼語句最小化。
SQL Server 不允許使用相同名稱、文化特性和公鑰註冊不同版本的元件。
嘗試存取 中指定的 <client_assembly_specifier>
元件時,SQL Server 會模擬目前 Windows 登入的安全性內容。 如果 <client_assembly_specifier>
指定網路位置 (UNC 路徑),則目前的登入模擬不會因為委派限制而轉送至網路位置。 此時就得利用 SQL Server 服務帳戶的資訊安全內容進行存取。 如需詳細資訊,請參閱認證 (資料引擎)。
除了 assembly_name 所指定的根組件之外,SQL Server 還會嘗試上傳任何正在上傳之根組件所參考的組件。 如果因為先前 CREATE ASSEMBLY
的語句而已將參考的元件上傳至資料庫,則不會上傳此元件,但可供根元件使用。 如果先前未上傳相依元件,但 SQL Server 在來源目錄中找不到其指令清單檔, CREATE ASSEMBLY
則傳回錯誤。
如果根元件所參考的任何相依元件尚未存在於資料庫中,而且會與根元件一起隱含載入,則它們具有與根層級元件相同的許可權集合。 如果相依組件必須以與根層級組件不同的權限集合加以建立,必須利用適當的權限集合,在根層級組件之前明確上傳。
組件驗證
SQL Server 會掃描 語句上傳的 CREATE ASSEMBLY
元件二進位檔,以確保下列檢查:
組件二進位具有有效的中繼資料和程式碼區段,格式良好,而且程式碼區段也具有有效的 Microsoft 中繼語言 (MSIL) 指示。
它參考的系統元件集合是 SQL Server 中下列其中一個支援的元件:、、、
System.Xml.dll
Microsoft.VisualC.dll
CustomMarshallers.dll
System.Security.dll
System.Web.Services.dll
System.Data.dll
System.dll
、System.Data.SqlXml.dll
System.Core.dll
和 。System.Xml.Linq.dll
mscorlib.dll
Microsoft.VisualBasic.dll
也可以參考其他系統組件,但是它們必須在資料庫中明確註冊。針對使用
SAFE
或EXTERNAL ACCESS
權限集合所建立的元件:組件程式碼應該是類型安全的程式碼。 類型安全性是藉由對組件執行 Common Language Runtime 驗證器而完成的。
除非元件標示為唯讀,否則元件不應該在其類別中包含任何靜態數據成員。
元件中的類別不能包含完成項方法。
組件的類別或方法只能以允許的程式碼屬性加以註解。 如需詳細資訊,請參閱 CLR整合:CLR 例程的自訂屬性。
除了先前在執行時 CREATE ASSEMBLY
執行的檢查之外,在元件中的程式代碼運行時間執行額外的檢查:
如果元件的許可權集不包含該許可權,呼叫需要特定程式代碼訪問許可權的特定 .NET Framework API 可能會失敗。
針對
SAFE
和EXTERNAL_ACCESS
元件,任何呼叫以特定 HostProtectionAttributes 標註的 .NET Framework API 嘗試都失敗。
如需詳細資訊,請參閱 設計元件。
權限
需要 CREATE ASSEMBLY
權限。
如果 PERMISSION_SET = EXTERNAL_ACCESS
指定 ,則需要 EXTERNAL ACCESS ASSEMBLY
伺服器上的許可權。 如果 PERMISSION_SET = UNSAFE
指定 ,則需要 UNSAFE ASSEMBLY
伺服器上的許可權。
如果任何由即將上傳之組件所參考的組件已經在資料庫中,則使用者必須是這些組件的擁有者才行。 若要利用檔案路徑來上傳組件,則目前使用者必須是 Windows 驗證的登入,或是 sysadmin 固定伺服器角色的成員。 執行 CREATE ASSEMBLY
之使用者的 Windows 登入必須具有共用的讀取許可權,以及正在語句中載入的檔案。
使用 CLR 嚴格安全性的權限
啟用 CLR strict security
時,需要有下列權限才能建立 CLR 組件:
- 使用者必須具有
CREATE ASSEMBLY
權限 - 而且,下列其中一個條件也必須成立:
- 組件是使用憑證或非對稱金鑰進行簽署,該金鑰有具有伺服器
UNSAFE ASSEMBLY
權限的對應登入。 建議簽署組件。 - 資料庫的
TRUSTWORTHY
屬性設定為ON
,而且具有伺服器之UNSAFE ASSEMBLY
權限的登入擁有資料庫。 不建議使用此選項。
- 組件是使用憑證或非對稱金鑰進行簽署,該金鑰有具有伺服器
如需元件許可權集合的詳細資訊,請參閱 設計元件。
範例
A. 從 DLL 建立元件
下列範例假設 SQL Server 資料庫引擎 範例會安裝在本機計算機的預設位置,並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;
重要
Azure SQL 資料庫 不支援從檔案建立元件。
B. 從元件位建立元件
將範例位(未完成或有效)取代為您的元件位。
CREATE ASSEMBLY HelloWorld
FROM 0x4D5A900000000000
WITH PERMISSION_SET = SAFE;