某些应用程序(比如数据仓库系统)十分依赖于源系统的变更数据识别功能,它们期望源系统能够提供一种高效低识别变更数据的能力。在SQLServer 2008之前并没有原生态的解决方案,开发人员不得不通过使用触发器、时间戳以及额外的表来实现该功能,在SQL Server2008之后,数据库提供了两种原生态的特性:Change Tracking(变更追踪)及Change Data Capture(变更数据捕获)。
简单来讲,所谓变更可以简化为两个问题:①变更有没有发生以及变更的类型;②数据从什么变更到了什么。SQL Server变更追踪的两个功能的区别就在于对这两个问题的回答。
变更时数据捕获功能同时回答了上面的两个问题,这意味着当我们对一条数据做操作之后,它不仅标示说这条记录被变更过来,而且同时会标示数据的变动历史。从底层实现来讲,该功能使用了一个异步进程来读取日志表从而将对系统的影响降到最小。
如下图展示的,所有对某个用户表所做的更改都会被存储在相应的变动表中,这些变动表提供了变动的历史视图,记录了随时间变化而发生的更改:
变更追踪功能仅仅捕获某条记录被变更过,但是不会记录数据的变动,这样应用程序可以识别出那些记录被更改过然后直接从基础表中获取最新的数据。这意味着变更追踪功能无法回答一些历史问题,但是这对于一些不需要知道历史信息仅需要知道变动是否发生的应用程序来说相当实用,因为该功能需要更少的存储空间。数据库实用一种异步的追踪机制来追踪变更。
下表列出了这两个特性的区别,CDC机制涉及到从事务日志中捕获变更,所以变更要在DML操作之后才能被捕获到;ChangeTracking使用了内联在DML操作中的异步变更追踪技术,所以变更信息会立即可得。
原文:http://yubowang.blog.51cto.com/8929119/1575400