SQL Server 2008 引入了两项跟踪功能,以使应用程序能够确定对数据库中的用户表所做的 DML 更改(插入、更新和删除操作)。 在这些功能出现之前,必须在应用程序中实现自定义跟踪机制。 这些自定义机制通常要求对跟踪的表进行架构更改,或者使用触发器。 变更数据捕获和更改跟踪均不要求在源中进行任何架构更改或使用触发器。
变更数据捕获通过获取进行 DML 更改的方面和更改的实际数据,提供用户表的历史更改信息。 更改是使用异步进程捕获的,此进程读取事务日志,并且对系统造成的影响很小。
正如下图所示,对用户表所做的更改是在相应更改表中捕获的。 这些更改表提供了更改随时间变化的历史视图。 借助于 SQL Server 提供的功能,可以方便且系统地使用更改数据。
更改跟踪
更改跟踪捕获更改了表行这一事实,但不会捕获更改的数据。 这样,应用程序就可以确定使用从用户表中直接获取的最新行数据更改的行。 因此,与变更数据捕获相比,更改跟踪可以解答的历史问题比较有限。 但是,对于不需要历史信息的那些应用程序,更改跟踪产生的存储开销要小得多,因为它不需要捕获更改的数据。 它使用同步跟踪机制来跟踪更改。 此功能旨在最大限度地减少 DML 操作开销。
下图显示了从使用更改跟踪中受益的同步方案。 在此方案中,应用程序需要以下信息:在上次表同步后更改的所有表行以及仅当前行数据。 由于使用同步机制来跟踪更改,因此,应用程序可以执行双向同步,并且可靠地检测到可能发生的任何冲突。
变更数据捕获与更改跟踪之间的功能差异
下表列出了变更数据捕获与更改跟踪之间的功能差异。 变更数据捕获中的跟踪机制涉及从事务日志中异步捕获更改,因此,可以在执行 DML 操作后获得更改信息。 更改跟踪中的跟踪机制涉及在执行 DML 操作的同时同步跟踪更改,因此,可以立即获得更改信息。
| 功能 | 变更数据捕获 | 更改跟踪 |
|---|---|---|
|
跟踪的更改 |
||
|
DML 更改 |
是 |
是 |
|
跟踪的信息 |
||
|
历史数据 |
是 |
否 |
|
是否更改了列 |
是 |
是 |
|
DML 类型 |
是 |
是 |
CT:相关函数
| 函数 | 说明 |
|---|---|
|
changetable(changes table change_version) changetable(version (key...),(value...)) |
用于获取在指定版本之后对某个表所做的所有更改的跟踪信息,或者获取指定行的最新更改跟踪信息。 |
| change_tracking_min_valid_vesion(table_object_id) |
用于获取在使用 CHANGETABLE 函数获取来自指定表的更改跟踪信息时要用的最低有效版本。 |
| change_tracking_current_version() |
获取与上次提交事务关联的版本。您可以在下一次使用 CHANGETABLE 来枚举更改时使用此版本。 |
| change_tracking_is_column_in_mask(column_id,chang_columns) |
用于解释由 CHANGETABLE(CHANGES …) 函数返回的 SYS_CHANGE_COLUMNS 值。 |
| with change_tracking_context() |
用于在应用程序更改数据时指定更改上下文,例如发起方 ID。 |
CT:相关目录视图
| 目录视图 | 说明 |
|---|---|
| sys.change_tracking_databases |
用于为 SQL Server 实例中启用了更改跟踪的每个数据库都返回一行。 |
| sys.change_tracking_tables |
为当前数据库中已启用更改跟踪的每个表返回一行。 |