空间数据 - sys.dm_db_objects_disabled_on_compatibility_level_change

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

列出由于更改 SQL Server 中的兼容级别而禁用的索引和约束。 在升级或更改兼容级别之后,包含持久化计算列且其表达式使用空间 UDT 的索引和约束将被禁用。 使用此动态管理函数可以确定兼容级别变化所带来的影响。

Transact-SQL 语法约定

语法

sys.dm_db_objects_disabled_on_compatibility_level_change ( compatibility_level )   

参数

compatibility_level
标识你计划设置的兼容性级别的 int

返回的表

列名称 数据类型 说明
class int 1 = 约束

7 = 索引和堆
class_desc nvarchar(60) 约束的 OBJECT 或 COLUMN

索引和堆的 INDEX
major_id int 约束的 OBJECT ID

包含索引和堆的表的 OBJECT ID
minor_id int 对于约束为 NULL

索引和堆的 Index_id
依赖 nvarchar(60) 导致禁用约束或索引的依赖项的说明。 在升级过程中引发的警告中也使用相同的值。 这方面的例子有:

“space”对应于内部

“geometry”对应于系统 UDT

“geography::Parse”对应于系统 UDT 的一个方法

一般备注

当更改兼容级别时,将禁用使用某些内部函数的持久化计算列。 此外,当升级数据库时,将禁用使用任何 Geometry 或 Geography 方法的持久化计算列。

哪些函数会导致禁用持久化计算列?

当在持久化计算列的表达式中使用以下函数时,如果兼容级别从 80 更改为 90,则它们会导致禁用引用这些列的索引和约束:

  • IsNumeric

当在持久化计算列的表达式中使用以下函数时,如果兼容级别从 100 更改为 110 或更高级别,则它们会导致禁用引用这些列的索引和约束:

  • Soundex

  • Geography:: GeomFromGML

  • Geography:: STGeomFromText

  • Geography:: STLineFromText

  • Geography:: STPolyFromText

  • Geography:: STMPointFromText

  • Geography:: STMLineFromText

  • Geography:: STMPolyFromText

  • Geography:: STGeomCollFromText

  • Geography:: STGeomFromWKB

  • Geography:: STLineFromWKB

  • Geography:: STPolyFromWKB

  • Geography:: STMPointFromWKB

  • Geography:: STMLineFromWKB

  • Geography:: STMPolyFromWKB

  • Geography:: STUnion

  • Geography:: STIntersection

  • Geography:: STDifference

  • Geography:: STSymDifference

  • Geography:: STBuffer

  • Geography:: BufferWithTolerance

  • Geography:: Parse

  • Geography:: Reduce

已禁用对象的行为

索引

如果禁用聚集索引,或者强制使用非聚集索引,则会引发以下错误:“查询处理器无法生成计划,因为表或视图 '%.*ls' 上的索引 '%.*ls' 已禁用。”若要重新启用这些对象,请在升级后通过调用 ALTER INDEX ON ... 重新生成索引。REBUILD

如果使用具有已禁用堆的表,则会引发以下错误。 若要重新启用这些对象,请在升级后通过调用 ALTER INDEX ALL ON...REBUILD

// ErrorNumber: 8674  
// ErrorSeverity: EX_USER  
// ErrorFormat: The query processor is unable to produce a plan because the table or view '%.*ls' is disabled.  
// ErrorCause: The table has a disabled heap.   
// ErrorCorrectiveAction: Rebuild the disabled heap to enable it.   
// ErrorInserts: table or view name   
// ErrorOwner: mtintor   
// ErrorFirstProduct: SQL11  

如果尝试在联机操作期间重新生成堆,则会引发错误。

检查约束和外键

禁用的检查约束和外键不会引发错误。 但修改行时,不强制执行约束。 若要重新启用这些对象,请在升级后通过调用 ALTER TABLE... 检查约束。CHECK CONSTRAINT

持久化计算列

由于无法禁用单个列,因此将通过禁用聚集索引或堆来禁用整个表。

安全性

权限

需要拥有 VIEW DATABASE STATE 权限。

SQL Server 2022 及更高版本的权限

需要对数据库具有 VIEW DATABASE PERFORMANCE STATE 权限。

示例

以下示例演示了对 sys.dm_db_objects_disabled_on_compatibility_level_change 的查询,以查找因将兼容级别更改为 120 而受影响的对象。

SELECT * FROM sys.dm_db_objects_disabled_on_compatibility_level_change(120);  
GO