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 严格安全 选项的影响。 如果启用 clr strict security
,所有程序集被视为 UNSAFE
。
UNSAFE
包含EXTERNAL_ACCESS
的数据库和选项不可用。
VISIBILITY = { ON | OFF }
指示在创建公共语言运行时 (CLR) 函数、存储过程、触发器、用户定义的类型以及针对它的用户定义的聚合函数时,该程序集是否可见。 如果设置为
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 FILE
, DROP 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 strict security 增强了 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
更改程序集版本。 程序集的区域性和公钥标记保持不变。
该 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;