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

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

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 严格安全 选项的影响。 如果启用 clr strict security,所有程序集被视为 UNSAFE

UNSAFE包含EXTERNAL_ACCESS的数据库和选项不可用。

VISIBILITY = { ON | OFF }

指示在创建公共语言运行时 (CLR) 函数、存储过程、触发器、用户定义的类型以及针对它的用户定义的聚合函数时,该程序集是否可见。 如果设置为 OFF/>,则程序集仅供其他程序集调用。 如果已针对程序集创建现有的 CLR 数据库对象,则无法更改程序集的可见性。 默认情况下,由 assembly_name 引用的任何程序集都上传为不可见。

UNCHECKED DATA

默认情况下,如果必须验证单个表行的一致性, ALTER ASSEMBLY 则失败。 此选项允许将检查推迟到以后使用 DBCC CHECKTABLE。 如果指定,即使数据库中存在包含以下条件的表,SQL Server 也会执行 ALTER ASSEMBLY 该语句:

  • 持久化计算列,这些列通过 Transact-SQL 函数或方法直接或间接引用程序集中的方法。

  • CHECK 直接或间接引用程序集中方法的约束。

  • 依赖于程序集的 CLR 用户定义类型的列,该类型实现 UserDefined (非Native) 序列化格式。

  • 使用 创建的 WITH SCHEMABINDING引用视图的 CLR 用户定义类型的列。

如果存在任何 CHECK 约束,它们将被禁用并标记为不受信任。 任何包含依赖于程序集的列的表都被标记为包含未检查数据,直到对这些表进行了显式检查为止。

只有 db_owner 和 db_ddlowner 固定数据库角色的成员才能指定该选项 。

ALTER ANY SCHEMA需要具有指定此选项的权限。

有关详细信息,请参阅 “实现程序集”。

DROP FILE { file_name [ ,...n ] |ALL }

从数据库中删除与程序集关联的文件名,或与该程序集关联的所有文件。 如果与以下项一起使用 ADD FILEDROP FILE 请先执行。 这样,便可以将文件替换为同一文件名。

注意

此选项在包含的数据库或Azure SQL 数据库中不可用。

ADD FILE FROM { client_file_specifier [ AS file_name ] | file_bits AS 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

注意

此选项在包含的数据库或Azure SQL 数据库中不可用。

不再支持代码访问安全性

CLR 在 .NET Framework 中使用代码访问安全性 (CAS)(不可再作为安全边界)。 使用 PERMISSION_SET = SAFE 创建的 CLR 程序集可能能够访问外部系统资源、调用非托管代码并获取 sysadmin 权限。 在 SQL Server 2017(14.x)及更高版本中, sp_configure 选项 clr 严格安全性增强了 CLR 程序集的安全性。 默认启用 clr strict security,并将 SAFEEXTERNAL_ACCESS 程序集与标记为 UNSAFE 的程序集同等对待。 clr strict security可以禁用此选项以实现向后兼容性,但不建议这样做。

建议使用证书或非对称密钥对所有程序集进行签名,并在数据库中使用已授予权限masterUNSAFE ASSEMBLY相应登录名。 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 更改程序集版本。 程序集的区域性和公钥标记保持不变。

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;