比较变更数据捕获和更改跟踪
SQL Server 2008 引入了两项跟踪功能,以使应用程序能够确定对数据库中的用户表所做的 DML 更改(插入、更新和删除操作)。 在这些功能出现之前,必须在应用程序中实现自定义跟踪机制。 这些自定义机制通常要求对跟踪的表进行架构更改,或者使用触发器。 变更数据捕获和更改跟踪均不要求在源中进行任何架构更改或使用触发器。
变更数据捕获
变更数据捕获通过获取进行 DML 更改的方面和更改的实际数据,提供用户表的历史更改信息。 更改是使用异步进程捕获的,此进程读取事务日志,并且对系统造成的影响很小。
正如下图所示,对用户表所做的更改是在相应更改表中捕获的。 这些更改表提供了更改随时间变化的历史视图。 借助于 SQL Server 提供的变更数据捕获功能,可以方便且系统地使用更改数据。
更改跟踪
更改跟踪捕获更改了表行这一事实,但不会捕获更改的数据。 这样,应用程序就可以确定使用从用户表中直接获取的最新行数据更改的行。 因此,与变更数据捕获相比,更改跟踪可以解答的历史问题比较有限。 但是,对于不需要历史信息的那些应用程序,更改跟踪产生的存储开销要小得多,因为它不需要捕获更改的数据。 它使用同步跟踪机制来跟踪更改。 此功能旨在最大限度地减少 DML 操作开销。
下图显示了从使用更改跟踪中受益的同步方案。 在此方案中,应用程序需要以下信息:在上次表同步后更改的所有表行以及仅当前行数据。 由于使用同步机制来跟踪更改,因此,应用程序可以执行双向同步,并且可靠地检测到可能发生的任何冲突。
变更数据捕获与更改跟踪之间的功能差异
下表列出了变更数据捕获与更改跟踪之间的功能差异。 变更数据捕获中的跟踪机制涉及从事务日志中异步捕获更改,因此,可以在执行 DML 操作后获得更改信息。 更改跟踪中的跟踪机制涉及在执行 DML 操作的同时同步跟踪更改,因此,可以立即获得更改信息。
功能 |
变更数据捕获 |
更改跟踪 |
---|---|---|
跟踪的更改 |
|
|
DML 更改 |
是 |
是 |
跟踪的信息 |
|
|
历史数据 |
是 |
否 |
是否更改了列 |
是 |
是 |
DML 类型 |
是 |
是 |