程序集 - 实现

适用于:SQL Server

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

  • 创建程序集

  • 修改程序集

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

  • 管理程序集版本

创建程序集

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

使用 Transact-SQL 创建程序集

使用 SQL Server Management Studio 创建程序集

修改程序集

程序集通过使用 Transact-SQL ALTER ASSEMBLY 语句或在 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 启用选项来禁用或启用在 SQL Server 中上传的所有程序集的执行。 禁用程序集执行防止公共语言运行时 (CLR) 函数、存储过程、触发器、聚合和用户定义类型执行并使当前正在执行的那些停止执行。 禁用程序集执行并不禁用创建、更改或删除程序集的功能。 有关详细信息,请参阅 已启用 clr 的服务器配置选项

禁用和启用程序集执行

管理程序集版本

将程序集上传到实例 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_ownerdb_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 实例将失败。

更新程序集的版本

另请参阅

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