消息 4900,级别 16,状态 2,第 1 行 对表 'XX.XXX' 执行 ALTER TABLE SWITCH 语句失败。对于已启用更改跟踪的表,不可能切换其分区。请先禁用更改跟踪,再使用 AL

问题描述:

今天处理切换分区数据的时候出现了这个错误:sql

消息 4900,级别 16,状态 2,第 1 行 对表 'XX.XXX' 执行 ALTER TABLE SWITCH 语句失败。对于已启用更改跟踪的表,不可能切换其分区。请先禁用更改跟踪,再使用 ALTER TABLE SWITCH。数据库

显示开启了跟踪须要先关闭才能切换分区函数

 

解决方案:

1.为数据库或表禁用更改跟踪

必须首先为全部启用了更改跟踪的表禁用更改跟踪,而后才能将数据库的更改跟踪设为 OFF。 若要肯定数据库中哪些表启用了更改跟踪,请使用 sys.change_tracking_tables 目录视图。性能

当数据库中没有用于跟踪更改的表时,即可以禁用数据库的更改跟踪。 下面的示例显示如何使用 ALTER DATABASE对数据库禁用更改跟踪。spa

ALTER DATABASE 库名 
SET CHANGE_TRACKING = OFF

下面的示例显示了如何使用 ALTER TABLE对表禁用更改跟踪。code

ALTER TABLE 表名 
DISABLE CHANGE_TRACKING;  

2.对数据库启用更改跟踪

您必须先在数据库级别启用更改跟踪,而后才能使用更改跟踪。 下面的示例显示了如何使用 ALTER DATABASE来启用更改跟踪。server

ALTER DATABASE 库名
SET CHANGE_TRACKING = ON  
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON)  

能够在启用更改跟踪时指定 CHANGE_RETENTION 和 AUTO_CLEANUP 选项,而且能够在启用更改跟踪后随时更改这些值。blog

更改保持期值指定了更改跟踪信息的保留时间。 早于此时间的更改跟踪信息将被按期删除。 设置该值时,应考虑应用程序与数据库中的表进行同步的频率。 指定的保持期必须至少等于最大同步时间间隔。 若是应用程序获取更改的时间间隔过长,则返回的结果可能不正确,由于某些更改信息可能已被删除。 若要避免获取错误的结果,应用程序可使用 CHANGE_TRACKING_MIN_VALID_VERSION 系统函数来肯定同步之间的时间间隔是否已太长。进程

可以使用 AUTO_CLEANUP 选项来启用或禁用删除陈旧的更改跟踪信息的清除任务。 若是出现临时性问题使得应用程序没法同步,而且在问题解决以前必须暂停用于删除早于保持期的更改跟踪信息的进程,则该设置会颇有用。get

对于使用更改跟踪的任何数据库,请注意如下事项:

  • 若要使用更改跟踪,必须将数据库兼容级别设为 90 或更高。 若是数据库的兼容级别低于 90,则能够配置更改跟踪。 可是,用于获取更改跟踪信息的 CHANGETABLE 函数将返回错误。

  • 使用快照隔离是帮助确保全部更改跟踪信息保持一致的最简单方式。 所以,咱们强烈建议将数据库的快照隔离设为 ON。 有关详细信息,请参阅处理更改跟踪 (SQL Server)

3.对表启用更改跟踪

对于要跟踪的每一个表都必须启用更改跟踪。 启用更改跟踪后,将会为表中受 DML 操做影响的全部行保留更改跟踪信息。

下面的示例显示了如何使用 ALTER TABLE来对表启用更改跟踪。

ALTER TABLE 表名
ENABLE CHANGE_TRACKING  
WITH (TRACK_COLUMNS_UPDATED = ON)  

你还能够经过使用 SQL Server Management Studio 数据库属性(“ChangeTracking”页) 数据库属性(“ChangeTracking”页) 中启用更改跟踪。

当 TRACK_COLUMNS_UPDATED 选项设为 ON 时, SQL Server 数据库引擎 会将有关哪些列已更新的额外信息存储到内部更改跟踪表中。 列跟踪使应用程序能够只同步那些已更新的列。 这能够提升效率和性能。 可是,因为保留列跟踪信息增长了一些额外的存储开销,于是默认状况下此选项设为 OFF。

 

参考来源:启用和禁用更改跟踪 (SQL Server)

相关文章
相关标签/搜索