ALTER ASSEMBLY (Transact-SQL)
適用於:SQL Server Azure SQL 受控執行個體
修改組件的 SQL Server 目錄屬性來改變組件。 ALTER ASSEMBLY
將它重新整理為保存其實作的最新 .NET Framework 模組複本,並新增或移除與其相關聯的檔案。 組件是利用 CREATE ASSEMBLY 加以建立的。
語法
ALTER ASSEMBLY assembly_name
[ FROM <client_assembly_specifier> | <assembly_bits> ]
[ WITH <assembly_option> [ , ...n ] ]
[ DROP FILE { file_name [ , ...n ] | ALL } ]
[ ADD FILE FROM
{
client_file_specifier [ AS file_name ]
| file_bits AS file_name
} [ , ...n ]
] [ ; ]
<client_assembly_specifier> ::=
'\\computer_name\share-name\ [ path\ ] manifest_file_name '
| '[ local_path\ ] manifest_file_name'
<assembly_bits> ::=
{ varbinary_literal | varbinary_expression }
<assembly_option> ::=
PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE }
| VISIBILITY = { ON | OFF }
| UNCHECKED DATA
引數
assembly_name
您要修改之元件的名稱。 assembly_name 必須已存在於資料庫中。
FROM <client_assembly_specifier> | <assembly_bits>
將組件更新為保留其實作的 .NET Framework 模組最新備份。 只有在沒有與指定組件相關的檔案時,才能使用這個選項。
<client_assembly_specifier>
會指定重新整理元件所在的網路或本機位置。 網路位置包含計算機名稱、共享名稱和該共用內的路徑。 manifest_file_name 指定包含組件資訊清單的檔案名稱。
重要
Azure SQL 資料庫 不支持參考檔案。
<assembly_bits>
是元件的二進位值。
必須針對也需要更新的任何相依元件發出個別 ALTER ASSEMBLY
語句。
PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE }
指定組件的 .NET Framework 程式碼存取權限集合屬性。 如需此屬性的詳細資訊,請參閱 CREATE ASSEMBLY。
選項 PERMISSION_SET
會受到 clr strict 安全性 選項的影響。 當 clr strict security
已啟用時,所有組件會被視為 UNSAFE
。
自主 EXTERNAL_ACCESS
資料庫中無法使用 和 UNSAFE
選項。
VISIBILITY = { ON | OFF }
指出是否會顯示組件,以對該組件建立 Common Language Runtime (CLR) 函數、預存程序、觸發程序、使用者自訂類型以及使用者定義彙總函式。 如果設定為 OFF
,則元件只能由其他元件呼叫。 如果已針對元件建立現有的 CLR 資料庫物件,則無法變更元件的可見性。 依預設,assembly_name 所參考的任何組件在上傳時都不會顯示。
UNCHECKED DATA
根據預設,如果必須確認個別數據表數據列的一致性, ALTER ASSEMBLY
就會失敗。 這個選項允許使用 將檢查延後到稍後使用 DBCC CHECKTABLE
。 如果指定,即使資料庫中有包含下列條件的數據表,SQL Server 仍會執行 ALTER ASSEMBLY
語句:
透過 Transact-SQL 函數或方法,直接或間接參考組件方法的保存計算資料行。
CHECK
直接或間接參考元件中方法的條件約束。相依於元件之 CLR 使用者定義型別的數據行,而型別會實作
UserDefined
(非Native
) 串行化格式。CLR 使用者定義型別的數據行,參考使用
WITH SCHEMABINDING
所建立的檢視。
如果有任何 CHECK
條件約束存在,則會停用並標示為不受信任。 任何包含相依於組件之資料行的資料表,都會標示為包含尚未檢查的資料,直到明確檢查過那些資料表為止。
只有 db_owner 和 db_ddlowner 固定資料庫角色的成員,才能夠指定這個選項。
ALTER ANY SCHEMA
需要許可權才能指定此選項。
如需詳細資訊,請參閱 實作元件。
DROP FILE { file_name [ ,...n ] |ALL }
從資料庫移除與該組件相關聯的檔案名稱,或是所有與該組件相關聯的檔案。 如果搭配 ADD FILE
使用, DROP FILE
請先執行 。 這可讓您以相同的檔案名取代檔案。
注意
此選項不適用於自主資料庫或 Azure SQL 資料庫。
新增 FILE FROM { client_file_specifier [ AS file_name ] | file_bits AS file_name }
將要與元件相關聯的檔案上傳至伺服器,例如原始程式碼、偵錯檔案或其他相關信息,並在目錄檢視中 sys.assembly_files
顯示。 client_file_specifier 會指定要上傳檔案的位置。 您可以改用 file_bits 來指定構成該檔的二進位值清單。 file_name 會指定該檔案儲存在 Transact-SQL 執行個體所用的名稱。 如果已指定 file_bits,則必須指定 file_name,而如果已指定 client_file_specifier,則為選用。 如果未 指定file_name,client_file_specifier 的 file_name 部分會作為 file_name使用。
注意
此選項不適用於自主資料庫或 Azure SQL 資料庫。
不再支援程式碼存取安全性
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。
備註
ALTER ASSEMBLY
不會中斷目前正在正在修改元件中執行程式代碼的會話。 目前工作階段是利用組件的未修改位元,來完成執行作業。
如果指定 子 FROM
句, ALTER ASSEMBLY
則會更新元件,以取得所提供模組的最新複本。 由於 SQL Server 實例中可能有已針對元件定義的 CLR 函數、預存程式、觸發程式、數據類型和使用者定義聚合函數,因此 ALTER ASSEMBLY
語句會將它們重新系結至元件的最新實作。 若要重新繫結,則對應到 CLR 函數、預存程序和觸發程序的方法,必須仍以相同的簽章留在修改後的組件中。 實作 CLR 使用者自訂類型和使用者定義彙總函式的類別,仍然必須滿足身為使用者自訂類型或彙總函式的需求。
警告
如果未 WITH UNCHECKED DATA
指定,SQL Server 會嘗試防止 ALTER ASSEMBLY
執行新的元件版本會影響數據表、索引或其他永續性站台中的現有數據。 不過,SQL Server 不保證更新 CLR 元件時,計算數據行、索引、索引檢視或表達式會與基礎例程和類型一致。 當您執行 ALTER ASSEMBLY
時請小心,以確定表達式的結果與根據儲存在元件中的表達式的值之間沒有不相符。
ALTER ASSEMBLY
變更元件版本。 組件的文化和公開金鑰 Token 仍然不變。
ALTER ASSEMBLY
語句無法用來變更下列專案:
SQL Server 執行個體中,參考該組件的 CLR 函數、彙總函式、預存程序和觸發程序簽章。 當 SQL Server 無法使用新版本的元件重新系結 SQL Server 中的 .NET Framework 資料庫物件時,ALTER ASSEMBLY 就會失敗。
組件中從其他組件呼叫的方法簽章。
相依於元件的元件清單,如元件之 屬性中所
DependentList
參考。方法的編製索引功能,除非沒有直接或間接相依於該方法的索引或保存計算資料行。
FillRow
CLR 數據表值函式的方法名稱屬性。Accumulate
使用者定義匯總的 和Terminate
方法簽章。系統組件。
系統擁有權。 請改用 ALTER AUTHORIZATION 。
此外,對於實作使用者定義型別的元件, ALTER ASSEMBLY
只能用於進行下列變更:
只要簽章或屬性未變更,就修改使用者定義型別類別的公用方法。
加入新的公用方法。
以任何方式修改私用方法。
原生串行化使用者定義型別中包含的欄位,包括數據成員或基類,無法使用 來變更 ALTER ASSEMBLY
。 所有其他變更亦不受支援。
如果未 ADD FILE FROM
指定,則會 ALTER ASSEMBLY
卸除與元件相關聯的任何檔案。
如果在 ALTER ASSEMBLY
未執行數據子句的情況下 UNCHECKED
執行,則會執行檢查,以確認新的元件版本不會影響數據表中的現有數據。 視需要檢查的數據量而定,此步驟可能會影響效能。
權限
ALTER
需要元件的許可權。 其他需求如下:
若要變更現有許可權集合為
EXTERNAL_ACCESS
的元件,需要EXTERNAL ACCESS ASSEMBLY
伺服器上的許可權。若要變更現有的許可權集合需要
UNSAFE
UNSAFE ASSEMBLY
伺服器許可權的元件。若要將元件的許可權集變更為
EXTERNAL_ACCESS
,則需要EXTERNAL ACCESS ASSEMBLY
伺服器上的許可權。若要將元件的許可權集變更為
UNSAFE
,則需要UNSAFE ASSEMBLY
伺服器上的許可權。指定
WITH UNCHECKED DATA
需要ALTER ANY SCHEMA
許可權。
使用 CLR 嚴格安全性的權限
啟用 clr strict security
時,需要有下列權限才能變更 CLR 組件:
使用者必須具有
ALTER ASSEMBLY
權限而且,下列其中一個條件也必須成立:
組件是使用憑證或非對稱金鑰進行簽署,該金鑰有具有伺服器
UNSAFE ASSEMBLY
權限的對應登入。 建議簽署組件。資料庫的
TRUSTWORTHY
屬性設定為ON
,而且具有伺服器之UNSAFE ASSEMBLY
權限的登入擁有資料庫。 不建議使用此選項。
如需元件許可權集合的詳細資訊,請參閱 設計元件。
範例
A. 重新整理元件
下列範例會將組件 ComplexNumber
更新為保留其實作的 .NET Framework 模組最新複本。
注意
您可以執行範例腳本來UserDefinedDataType
建立元件ComplexNumber
。 如需相關資訊,請參閱使用者定義型別。
ALTER ASSEMBLY ComplexNumber
FROM 'C:\Program Files\Microsoft SQL Server\130\Tools\Samples\1033\Engine\Programmability\CLR\UserDefinedDataType\CS\ComplexNumber\obj\Debug\ComplexNumber.dll'
重要
Azure SQL 資料庫 不支持參考檔案。
B. 新增要與元件建立關聯的檔案
下列範例會上傳即將與組件 Class1.cs
建立關聯的原始程式碼檔案 MyClass
。 這個範例假設組件 MyClass
已在資料庫中建立。
ALTER ASSEMBLY MyClass
ADD FILE FROM 'C:\MyClassProject\Class1.cs';
重要
Azure SQL 資料庫 不支持參考檔案。
C. 變更元件的許可權
下列範例會將組件 ComplexNumber
的權限集合,從 SAFE 改為 EXTERNAL ACCESS
。
ALTER ASSEMBLY ComplexNumber WITH PERMISSION_SET = EXTERNAL_ACCESS;