ALTER ASSEMBLY (Transact-SQL)

修改組件的 SQL Server 目錄屬性來改變組件。 ALTER ASSEMBLY 會將它重新整理為保留其實作的 Microsoft .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 指定包含組件資訊清單的檔案名稱。

    <assembly_bits> 是組件的二進位值。

    必須針對同樣需要更新的每一個相依組件分別發出 ALTER ASSEMBLY 陳述式。

    [!附註]

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

  • PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE }
    指定組件的 .NET Framework 程式碼存取權限集合屬性。 如需有關這個屬性的詳細資訊,請參閱<CREATE ASSEMBLY (Transact-SQL)>。

    [!附註]

    自主資料庫無法使用 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 (非原生) 序列化格式之類型的資料行。

    • 參考利用 WITH SCHEMABINDING 建立之檢視的 CLR 使用者自訂類型資料行。

    如果有任何 CHECK 條件約束存在,都會被停用,並且標示為未受信任。 任何包含相依於組件之資料行的資料表,都會標示為包含尚未檢查的資料,直到明確檢查過那些資料表為止。

    只有 db_ownerdb_ddlowner 固定資料庫角色的成員,才能夠指定這個選項。

    如需詳細資訊,請參閱<實作組件>。

  • [ DROP FILE { file_name[ ,...n] | ALL } ]
    從資料庫移除與該組件相關聯的檔案名稱,或是所有與該組件相關聯的檔案。 如果使用底下的 ADD FILE,則會先執行 DROP FILE。 此舉可讓您取代同名的檔案。

    [!附註]

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

  • [ ADD FILE FROM { client_file_specifier [ AS file_name] | file_bitsAS file_name}
    將與組件相關聯的檔案 (例如,原始程式碼、偵錯檔案或其他相關資訊),上傳到伺服器,並顯示在 sys.assembly_files 目錄檢視中。 client_file_specifier 會指定從哪裡上傳檔案。 您可以改用 file_bits 來指定構成該檔的二進位值清單。 file_name 會指定該檔案儲存在 SQL Server 執行個體所用的名稱。 如果您是指定 file_bits,則必須指定 file_name,但如果您是指定 client_file_specifier,就不一定要指定 file_name。 如果未指定 file_name,client_file_specifier 的 file_name 部分會當作 file_name 使用。

    [!附註]

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

備註

ALTER ASSEMBLY 不會中斷正在修改的組件中,目前正在執行程式碼的執行中工作階段。 目前工作階段是利用組件的未修改位元,來完成執行作業。

如果指定了 FROM 子句,ALTER ASSEMBLY 便會以所提供的模組最新備份來更新組件。 由於 SQL Server 執行個體中,可能已經針對該組件定義了 CLR 函數、預存程序、觸發程序、資料類型和使用者自訂彙總函式,因此 ALTER ASSEMBLY 陳述式會將它們重新繫結到組件的最新實作中。 若要重新繫結,則對應到 CLR 函數、預存程序和觸發程序的方法,必須仍以相同的簽章留在修改後的組件中。 實作 CLR 使用者自訂類型和使用者自訂彙總函式的類別,仍然必須滿足身為使用者自訂類型或彙總函式的需求。

警告注意事項注意

在未指定 WITH UNCHECKED DATA 的情況下,如果新組件版本影響資料表、索引或其他永續性站台中現有的資料,SQL Server 將嘗試阻止 ALTER ASSEMBLY 執行。 不過,當 CLR 組件更新時,SQL Server 並不保證計算資料行、索引、索引檢視或運算式都會與基礎常式及類型保持一致。 執行 ALTER ASSEMBLY 時請特別小心,以確定運算式的結果與儲存在組件中以該運算式作為基礎的值沒有不相符的情況。

ALTER ASSEMBLY 會變更組件版本。 組件的文化和公開金鑰 Token 仍然不變。

ALTER ASSEMBLY 陳述式不能用來變更下列各項:

  • SQL Server 執行個體中,參考該組件的 CLR 函數、彙總函式、預存程序和觸發程序簽章。 如果 SQL Server 無法將 SQL Server 中的 .NET Framework 資料庫物件,與新版組件重新繫結時,ALTER ASSEMBLY 就會失敗。

  • 組件中從其他組件呼叫的方法簽章。

  • 相依於組件的其他組件清單,可在該組件的 DependentList 屬性中參考這份清單。

  • 方法的編製索引功能,除非沒有直接或間接相依於該方法的索引或保存計算資料行。

  • CLR 資料表值函式的 FillRow 方法名稱屬性。

  • 使用者自訂彙總的 Accumulate 和 Terminate 方法簽章。

  • 系統組件。

  • 系統擁有權。 請改用 ALTER AUTHORIZATION (Transact-SQL)

此外,針對實作使用者自訂類型的組件,ALTER ASSEMBLY 只能用來進行下列變更:

  • 修改使用者自訂類型類別的公用方法,只要簽章或屬性沒有變更即可。

  • 加入新的公用方法。

  • 以任何方式修改私用方法。

包含在原生序列化使用者自訂類型 (包括資料成員或基底類別) 中的欄位,不能使用 ALTER ASSEMBLY 加以變更。 所有其他變更亦不受支援。

如果未指定 ADD FILE FROM,ALTER ASSEMBLY 便會卸除任何與該組件相關聯的檔案。

如果執行 ALTER ASSEMBLY 時,沒有 UNCHECKED 資料子句,則會進行檢查,驗證新組件版本沒有影響資料表中現有的資料。 此舉可能會影響效能,這一點要看必須檢查的資料量而定。

權限

需要組件的 ALTER 權限。 其他需求如下:

  • 若要變更現有權限集合為 EXTERNAL_ACCESS 的組件,SQL Server 登入需要伺服器的 EXTERNAL ACCESS 權限。

  • 若要變更現有權限集合為 UNSAFE 的組件,必須具備系統管理員 (sysadmin) 固定伺服器角色中的成員資格。

  • 若要將組件的權限集合改為 EXTERNAL_ACCESS,SQL Server 登入需要伺服器的 EXTERNAL ACCESS ASSEMBLY 權限。

  • 若要將組件的權限集合改為 UNSAFE,必須具備系統管理員 (sysadmin) 固定伺服器角色中的成員資格。

  • 若要指定 WITH UNCHECKED DATA,必須具備系統管理員 (sysadmin) 固定伺服器角色中的成員資格。

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

範例

A.重新整理組件

下列範例會將組件 ComplexNumber 更新為保留其實作的 .NET Framework 模組最新副本。

[!附註]

您可以執行 UserDefinedDataType 範例指令碼,來建立組件 ComplexNumber。 如需詳細資訊,請參閱<使用者定義型別>。

ALTER ASSEMBLY ComplexNumber

FROM 'C:\Program Files\Microsoft SQL Server\90\Tools\Samples\1033\Engine\Programmability\CLR\UserDefinedDataType\CS\ComplexNumber\obj\Debug\ComplexNumber.dll'

B.加入檔案,與組件建立關聯

下列範例會上傳即將與組件 MyClass 建立關聯的原始程式碼檔案 Class1.cs。 這個範例假設組件 MyClass 已在資料庫中建立。

ALTER ASSEMBLY MyClass 
ADD FILE FROM 'C:\MyClassProject\Class1.cs';

C.變更組件的權限

下列範例會將組件 ComplexNumber 的權限集合,從 SAFE 改為 EXTERNAL ACCESS。

ALTER ASSEMBLY ComplexNumber WITH PERMISSION_SET = EXTERNAL_ACCESS

請參閱

參考

CREATE ASSEMBLY (Transact-SQL)

DROP ASSEMBLY (Transact-SQL)

EVENTDATA (Transact-SQL)