实现程序集

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

  • 创建程序集

  • 修改程序集

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

  • 管理程序集版本

创建程序集

使用 Transact-SQL CREATE ASSEMBLY 语句在 SQL Server 中创建程序集或者使用程序集辅助编辑器在 SQL Server Management Studio 中创建程序集。此外,在 MicrosoftVisual Studio 中部署 SQL Server 项目将在为该项目指定的数据库中注册一个程序集。有关详细信息,请参阅部署 CLR 数据库对象

使用 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 选项

禁用和启用程序集执行

管理程序集版本

将程序集上载到 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 执行。但是,当 CLR 程序集更新时,SQL Server 不能保证计算列、索引、索引视图或表达式与基本例程和类型保持一致。执行 ALTER ASSEMBLY 时一定要谨慎,以确保表达式的结果与程序集中存储的基于该表达式的值相互匹配。

只有 db_ownerdb_ddlowner 固定数据库角色的成员可以使用 WITH UNCHECKED DATA 子句运行 ALTER ASSEMBLY。

SQL Server 将消息(程序集对表中的未检查数据已修改)投递给 Windows 应用程序事件日志。然后 SQL Server 将任何包含依赖于程序集的数据的表标记为带有未检查数据的表。sys.tables 目录视图中的 has_unchecked_assembly_data 列包含值 1(用于包含未检查数据的表)和值 0(用于不包含未检查数据的表)。

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

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

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

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

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

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

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

更新程序集的版本