空间数据 - sys.dm_db_objects_disabled_on_compatibility_level_change
适用于:SQL Server Azure SQL 数据库 Azure SQL 托管实例
列出由于在 SQL Server 中更改兼容性级别而禁用的索引和约束。 在升级或更改兼容级别之后,包含持久化计算列且其表达式使用空间 UDT 的索引和约束将被禁用。 使用此动态管理函数可以确定兼容级别变化所带来的影响。
语法
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 |
dependency | 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
地理位置::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