程序集 - 实现

适用于:SQL Server

本主题提供有关以下方面的信息以帮助您在数据库中实现和使用程序集:

  • 创建程序集

  • 修改程序集

  • 删除、禁用和启用程序集

  • 管理程序集版本

创建程序集

程序集使用 Transact-SQL CREATE ASSEMBLY 语句在 SQL Server 中创建,或在 SQL Server Management Studio中使用程序集辅助编辑器创建。 此外,在 Microsoft Visual Studio 中部署 SQL Server 项目会注册为项目指定的数据库中的程序集。 有关详细信息,请参阅 Deploying CLR Database Objects

使用 Transact-SQL 创建程序集

使用 SQL Server Management Studio 创建程序集

修改程序集

使用 Transact-SQL ALTER ASSEMBLY 语句在 SQL Server 中修改程序集,或使用程序集辅助编辑器在 SQL Server Management Studio 中修改程序集。 当要执行以下操作时,可以修改程序集:

  • 通过上载二进制的程序集的较新版本来更改程序集的实现。 有关详细信息,请参阅本主题后面的 管理程序集版本

  • 更改程序集的权限集。 有关详细信息,请参阅设计程序集

  • 更改程序集的可见性。 可见程序集可用于在 SQL Server 中引用。 不可以引用不可见程序集,即使它们已上载在数据库中。 默认情况下,上传到 SQL Server 实例的程序集是可见的。

  • 添加或删除与程序集关联的调试文件或源文件。

使用 Transact-SQL 修改程序集

使用 SQL Server Management Studio 修改程序集

删除、禁用和启用程序集

使用 Transact-SQL DROP ASSEMBLY 语句或SQL Server Management Studio删除程序集。

使用 Transact-SQL 删除程序集

使用 SQL Server Management Studio 删除程序集

默认情况下,禁用在 SQL Server 中创建的所有程序集执行。 可以使用 sp_configure 系统存储过程的 clr enabled 选项来禁用或启用SQL Server中上传的所有程序集的执行。 禁用程序集执行防止公共语言运行时 (CLR) 函数、存储过程、触发器、聚合和用户定义类型执行并使当前正在执行的那些停止执行。 禁用程序集执行并不禁用创建、更改或删除程序集的功能。 有关详细信息,请参阅 clr enabled Server Configuration Option

禁用和启用程序集执行

管理程序集版本

将程序集上传到SQL Server实例时,该程序集在数据库系统目录中存储和管理。 对 Microsoft .NET Framework中的程序集定义所做的任何更改都应传播到存储在数据库目录中的程序集。

当必须修改程序集时,您必须发出 ALTER ASSEMBLY 语句以更新数据库中的程序集。 这会将程序集更新为保存其实现的.NET Framework模块的最新副本。

ALTER ASSEMBLY 语句的 WITH UNCHECKED DATA 子句指示SQL Server刷新那些依赖于数据库中持久化数据的程序集。 特别地,如果存在以下任何内容,您必须指定 WITH UNCHECKED DATA:

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

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

注意

未指定 WITH UNCHECKED DATA 时,如果新的程序集版本对表、索引或其他持久性站点中的现有数据造成影响,则 SQL Server 将尝试阻止 ALTER ASSEMBLY 执行。 但是,SQL Server并不能保证更新 CLR 程序集时,计算列、索引、索引视图或表达式将与基础例程和类型一致。 执行 ALTER ASSEMBLY 时一定要谨慎,以确保表达式的结果与程序集中存储的基于该表达式的值相互匹配。

只有 db_owner 成员和 db_ddlowner 固定数据库角色的成员才能使用 WITH UNCHECKED DATA 子句执行运行 ALTER ASSEMBLY。

SQL Server向 Windows 应用程序事件日志发布消息,指出已使用表中的未选中数据修改了程序集。 然后,SQL Server将包含依赖于程序集的数据的任何表标记为具有未选中的数据。 sys.tables 目录视图的 has_unchecked_assembly_data 列包含值 1(对于包含未选中数据的表),对于没有未选中数据的表,则包含值 0。

若要解决未检查数据的完整性,请对包含未检查数据的每个表运行 DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS。 如果 DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS失败,则必须删除无效的表行或修改程序集代码以解决问题,然后发出其他 ALTER ASSEMBLY 语句。

ALTER ASSEMBLY 可更改程序集版本。 程序集的区域性和公钥标记保持不变。SQL Server不允许注册具有相同名称、区域性和公钥的不同版本的程序集。

与版本绑定的计算机范围的策略交互

如果使用发布者策略或计算机范围的管理员策略将存储在 SQL Server 中的程序集的引用重定向到特定版本,则必须执行以下操作之一:

  • 请确保此重定向到的新版本在数据库中。

  • 对计算机策略或发行者策略的外部策略文件的任何语句进行修改以确保它们引用数据库中的特定版本。

否则,尝试将新程序集版本加载到 SQL Server 实例将失败。

更新程序集的版本

另请参阅

程序集(数据库引擎)
获取有关程序集的信息