SQL Server 2008 引入了更改跟踪,这是一种轻量型解决方案,它为应用程序提供了一种有效的更改跟踪机制。通常,若要使应用程序能够查询对数据库中的数据所做的更改和访问与这些更改相关的信息,应用程序开发人员必须实现自定义更改跟踪机制。创建这些机制通常涉及多项工作,并且常常涉及使用触发器、timestamp 列和新表组合来存储跟踪信息,同时还会涉及使用自定义清除过程。使用变更跟踪数据库结构无需任何更改,也不会创建任何触发器。
下表介绍在应用程序中使用更改跟踪而不开发自定义解决方案来跟踪数据库中的更改的一些好处。
好处 | 说明 |
---|---|
减少了开发时间。 |
由于 SQL Server 2008 中提供了更改跟踪功能,因此无需开发自定义解决方案。 |
不需要架构更改。 |
使用更改跟踪不需要执行以下任务:
|
内置清除机制。 |
更改跟踪的清除操作在后台自动执行。不需要端表中存储的数据的自定义清除。 |
提供更改跟踪功能的目的是获取更改信息。 |
使用更改跟踪功能可使信息查询和使用更方便。列跟踪记录提供与更改的数据相关的详细信息。 |
降低了 DML 操作的开销。 |
同步更改跟踪始终会有一些开销。但是,使用更改跟踪有助于使开销最小化。开销通常会低于使用其他解决方案,对于需要使用触发器的解决方案,尤其如此。 |
更改跟踪是基于提交的事务进行的。 |
更改的顺序基于事务提交时间。在存在长时间运行和重叠事务的情况下,这样可获得可靠的结果。必须专门设计使用 timestamp 值的自定义解决方案,以处理这些情况。 |
配置和管理更改跟踪的标准工具。 |
SQL Server 2008 提供标准的 DDL 语句、SQL Server Management Studio、目录视图和安全权限。 |
配置和管理更改跟踪

启用表的更改跟踪后,会影响某些管理操作。下表列出了应当注意的操作和影响。
操作 | 启用更改跟踪后 |
---|---|
DROP TABLE |
会删除已删除表的所有更改跟踪信息。 |
ALTER TABLE DROP CONSTRAINT |
删除 PRIMARY KEY 约束的尝试将失败。必须先禁用更改跟踪,然后才能删除 PRIMARY KEY 约束。 |
ALTER TABLE DROP COLUMN |
如果要删除的列是主键的一部分,则不允许删除该列,而不管是否启用了更改跟踪。 如果要删除的列不是主键的一部分,则可以成功删除该列。但是,首先应了解此操作对同步此数据的任何应用程序的影响。如果为该表启用了列更改跟踪,则可能仍会将已删除的列作为更改跟踪信息的一部分返回。已删除列的处理由应用程序负责。 |
ALTER TABLE ADD COLUMN |
如果将新列添加到启用了更改跟踪的表中,则不会跟踪该列的添加。只会跟踪对新列所做的更新和更改。 |
ALTER TABLE ALTER COLUMN |
不会跟踪非主键列的数据类型更改。 |
ALTER TABLE SWITCH |
如果其中一个表或两个表都启用了更改跟踪,则切换分区将失败。 |
DROP INDEX 或 ALTER INDEX DISABLE |
不能删除或禁用强制使用主键的索引。 |
TRUNCATE TABLE |
可以对启用了更改跟踪的表执行截断表操作。但是,不会跟踪由该操作删除的行,并且会更新最低有效版本。当应用程序检查其版本时,检查结果会表明该版本太陈旧,需要进行重新初始化。这与禁用后又重新启用表的更改跟踪的效果相同。 |
由于在操作过程中会存储更改跟踪信息,因此使用更改跟踪会增加 DML 操作的一些开销。
更改跟踪函数
a. CHANGE_TRACKING_CURRENT_VERSION
返回与上次提交的事务相关联的版本号。启用了更改跟踪的数据库具有一个版本计数器,在对启用了更改跟踪的表进行更改时,该计数器会随之递增。每个更改的行都有一个关联的版本号。可以在每次查询完成后,记录这个版本号,下次查询时,基于这个版本号查询,以获取后续的最新更改。
b. CHANGE_TRACKING_MIN_VALID_VERSION
指定表可用的最低有效版本号。在第一次查询数据的时候,可以使用此函数得到查询更改信息的起始版本号;
c. CHANGETABLE(CHANGES)
返回自指定版本起对表所做的所有更改的跟踪信息;
d. CHANGETABLE(VERSION)
返回指定行的最新更改跟踪信息。(通过指定特定行对应的主键列值);
e. CHANGE_TRACKING_IS_COLUMN_IN_MASK
通过CHANGETABLE(CHANGES …)函数返回的SYS_CHANGE_COLUMNS值及列id,确定该列是否被UPDATE。
参考资料:http://msdn.microsoft.com/zh-cn/library/cc280462.aspx
http://blog.csdn.net/zjcxc/archive/2009/03/10/3975644.aspx#_Toc224445830