在日常应用中经常会有这样的需求,需要Audit那些数据更改,或者需要跟踪更改的数据实现对数据的同步。(最常见的应用如数据仓库数据同步,因为数据量巨大,需要将数据的更改同步到数据仓库,这种同步不要求实时)。
通常的做法是自定义应用程序使用比如触发器、timestamp 列和新表组合来存储跟踪信息,同事还需要自定义清除程序清除过时的数据。在SQLServer 2008以后提供了一个功能更改跟踪(Change Tracking).这一种轻量型解决方案(相对于自己自定义的程序,性能要高)为应用程序提供了一种有效的更改跟踪机制。
注意:用程序需要有关所有所做更改的信息以及所更改数据的中间值,则可能适合使用变更数据捕获,而不适合使用更改跟踪。
工作原理:为表配置了更改跟踪后,任何影响该表中的行的 DML 语句都将导致针对每个有所修改的行的更改跟踪信息被记录下来。更改信息会记录到SQL Server内部表中,可以使用sys.internal_tables查询到内部表,使用CHANGETABLE函数获得数据更改信息。
下面是启动Change Tracking并且获得更改数据的脚本:
--创建测试数据库和表
create databasetest
go
CREATE TABLE[dbo].[A](
[MAXID] [int] NOT NULL,
[name] [varchar](20)NULL,
CONSTRAINT [PK_A] PRIMARY KEYCLUSTERED
(
[MAXID] ASC
)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,IGNORE_DUP_KEY= OFF,ALLOW_ROW_LOCKS=ON,ALLOW_PAGE_LOCKS=ON)ON[PRIMARY]
) ON[PRIMARY]
--在数据库和表启动更改跟踪:
ALTER DATABASEtest