分享方式:


ALTER ASSEMBLY (Transact-SQL)

適用於:SQL Server Azure SQL 受控執行個體

修改組件的 SQL Server 目錄屬性來改變組件。 ALTER ASSEMBLY 將它重新整理為保存其實作的最新 .NET Framework 模組複本,並新增或移除與其相關聯的檔案。 組件是利用 CREATE ASSEMBLY 加以建立的。

Transact-SQL 語法慣例

語法

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_ownerdb_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_specifierfile_name 部分會作為 file_name使用。

注意

此選項不適用於自主資料庫或 Azure SQL 資料庫。

不再支援程式碼存取安全性

CLR 使用 .NET Framework 中的程式碼存取安全性 (CAS),而這不再作為安全性界限受支援。 使用 PERMISSION_SET = SAFE 所建立的 CLR 組件可以存取外部系統資源、呼叫非受控程式碼,以及取得系統管理員權限。 在 SQL Server 2017 (14.x) 和更新版本中,sp_configure 安全性選項可增強 CLR 嚴格安全性clr strict security 會依預設啟用,且將 SAFEEXTERNAL_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 伺服器上的許可權。

  • 若要變更現有的許可權集合需要UNSAFEUNSAFE 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;