实现程序集
适用范围:SQL Server
本文提供有关以下方面的信息,可帮助你实现和使用数据库中的程序集:
- 创建程序集
- 修改程序集
- 删除、禁用和启用程序集
- 管理程序集版本
创建程序集
程序集是使用 Transact-SQL CREATE ASSEMBLY
语句或在 SQL Server Management Studio 中使用程序集辅助编辑器创建的。 此外,在 Microsoft Visual Studio 中部署 SQL Server 项目会注册为项目指定的数据库中的程序集。 有关详细信息,请参阅 Deploying CLR Database Objects。
- 使用 Transact-SQL: CREATE ASSEMBLY (Transact-SQL)
- 使用 SQL Server Management Studio: 程序集 - 属性
修改程序集
程序集通过使用 Transact-SQL ALTER ASSEMBLY
语句或在 SQL Server Management Studio 中使用程序集辅助编辑器进行修改。
- 使用 Transact-SQL: ALTER ASSEMBLY (Transact-SQL)
- 使用 SQL Server Management Studio: 程序集 - 属性
若要执行以下操作,可以修改程序集:
通过上载二进制的程序集的较新版本来更改程序集的实现。 有关详细信息,请参阅 本文后面的“管理程序集版本 ”。
更改程序集的权限集。 有关详细信息,请参阅 设计程序集。
更改程序集的可见性。 可见程序集可用于在 SQL Server 中引用。 不可见的程序集不可用,即使它们在数据库中上传也是如此。 默认情况下,上传到 SQL Server 实例的程序集可见。
添加或删除与程序集关联的调试文件或源文件。
删除、禁用和启用程序集
使用 Transact-SQL DROP ASSEMBLY
语句或 SQL Server Management Studio 删除程序集。
- 使用 Transact-SQL: DROP ASSEMBLY (Transact-SQL)
- 使用 SQL Server Management Studio: 删除对象
默认情况下,在 SQL Server 中创建的所有程序集都会被禁用执行。 可以使用 clr enabled
系统存储过程的选项 sp_configure
来禁用或启用在 SQL Server 中上传的所有程序集的执行。 禁用程序集执行可防止公共语言运行时(CLR)函数、存储过程、触发器、聚合和用户定义的类型执行,并停止当前正在执行的任何类型。 禁用程序集执行不会禁用创建、更改或删除程序集的功能。 有关详细信息,请参阅 服务器配置:已启用 clr。
有关详细信息,请参阅 sp_configure。
管理程序集版本
将程序集上传到实例 SQL Server 时,该程序集将存储和托管在数据库系统目录中。 对 Microsoft .NET Framework 中程序集定义所做的任何更改都应传播到存储在数据库目录中的程序集。
必须修改程序集时,必须发出 ALTER ASSEMBLY
语句来更新数据库中的程序集。 此语句将程序集更新为保存其实现的 .NET Framework 模块的最新副本。
该 WITH UNCHECKED DATA
语句的 ALTER ASSEMBLY
子句指示 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 将包含依赖于程序集的数据的任何表标记为具有未选中的数据。 目录has_unchecked_assembly_data
视图的sys.tables
列包含包含未选中数据的表的值,以及0
不包含未选中数据的表的值1
。
若要解决未选中数据的完整性,请针对具有未选中数据的每个表运行 DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS
。 如果 DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS
失败,则必须删除无效的表行,或修改程序集代码以解决问题,然后发出更多 ALTER ASSEMBLY
语句。
ALTER ASSEMBLY
更改程序集版本。 程序集的区域性和公钥标记保持不变。 SQL Server 不允许使用同一名称、区域性和公钥注册不同版本的程序集。
与计算机范围的策略交互,用于版本绑定
如果使用发布服务器策略或计算机范围的管理员策略重定向到 SQL Server 中存储的程序集的引用,则必须执行以下操作之一:
请确保此重定向到的新版本在数据库中。
对计算机策略或发行者策略的外部策略文件的任何语句进行修改以确保它们引用数据库中的特定版本。
否则,尝试将新的程序集版本加载到 SQL Server 实例失败。
有关详细信息,请参阅 ALTER ASSEMBLY。