Andone勇闯天涯

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

更改跟踪的使用与说明

一、概述
更改跟踪是为了便于数据同步而开发的,相比于CDC,它只记录表中的行是否有过更改,而不记录更改的历史数据,因此更改跟踪,是一个相对开销比较小的数据同步解决方案


二、使用更改跟踪的条件
1.sql server 2008版本及以上
2.被跟踪的表,必须有主键

三、使用更改跟踪注意事项
1.如果主键是自增列,当自增列修改为非自增列时,则更改跟踪自动关闭
2.如果主键列更改,则在跟踪信息表中,记录两笔记录,一笔删除,一笔插入,且更新版本号一致,如果下图的sys_change_version 值为15的记录
3.如果删除一条记录,插入新的记录时,主键值与删除记录的主键值相同,则记录表删除记录中的sys_change_operation的值有D(删除)更改为I(插入)
4.表配置跟踪后,新增加一列,则新增加的列数据,如果有更新也会被跟踪
5.配置了更改跟踪的表,主键不允许删除,如果维护时要重建索引,则先关闭更改跟踪


四、更改跟踪的配置
1.开启(关闭)数据库的更改跟踪
启用更改跟踪(Chang Tracking),跟踪记录保留2天,系统自动清理(HOURS)
ALTER DATABASE TestDB
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS,
AUTO_CLEANUP = ON)

关闭数据库跟踪
USE [master]
GO
ALTER DATABASE [TestDB] SET CHANGE_TRACKING = OFF
GO

--2.开启表的更改跟踪
ALTER TABLE [dbo].[TestTable]
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = OFF) --此选项为是否开启列的跟踪,我们方案中不需要,

--说明:列跟踪,是指如果跟踪某些的变化,然后同步更新
--关闭表跟踪
USE [c]
GO
ALTER TABLE [dbo].[TestTable] DISABLE CHANGE_TRACKING
GO

3.检查脚本
--查看数据库是否启用更改跟踪
SELECT DB_NAME(database_id) DataBaseName,is_auto_cleanup_on,
retention_period,retention_period_units_desc
FROM sys.change_tracking_databases

--查看表是否启用更改跟踪
SELECT OBJECT_NAME(object_id) TableName,*
FROM sys.change_tracking_tables


4.数据同步操作
a)同步流程
配置要同步的表--->获取跟踪表的最小有效版本--->获取上次同步的最新版本-->比较最小有效版本和同步最新版本--->同步数据--->更新配置表的最新同步版本号
b) 常用的函数
当前版本,如果一个DB中多个表,则返回所有表的最后一个,也就是数据库级别的当前版本
SELECT CHANGE_TRACKING_CURRENT_VERSION ()
AS CURRENT_VERSION

最小版本
SELECT CHANGE_TRACKING_MIN_VALID_VERSION
(OBJECT_ID('dbo.TestTable')) AS MIN_VERSION

查看版本0之后的更改
SELECT *
FROM CHANGETABLE(CHANGES dbo.TestTable, 0) AS CT

说明:1.sys_change_version:本次更改记录的版本号
2.sys_change_creation_version:此记录创建的版本号,即数据插入时的版本号,如果跟踪开启前数据已经插入,则此列为NULL
3.sys_change_operation:记录的操作,D-删除,I-插入,U-更新
4.sys_change_columns,sys_change_context:开启列跟踪后会记录,否则为空
5.id:被跟踪表的主键

同步数据
SELECT *
FROM
c.dbo.TestTable AS c WITH(NOLOCK)
RIGHT OUTER JOIN
CHANGETABLE(CHANGES c.dbo.TestTable,0) AS ct
ON
c.id= ct.id


转载请注明出处

posted on 2018-12-19 09:32  Andone勇闯天涯  阅读(349)  评论(0编辑  收藏  举报