申明本博客转至http://www.codeproject.com/Articles/338724/SQL-Change-Tracking-on-Table

在阅读这篇博客之前,我想告诉你我并不是经常写博客,这只是一个尝试,如果写的不好请见谅,我仅仅想告诉你们一些sql内在机制。

凭经验,很多时候我们都人事为触发器不是最好查找一个表修改痕迹的方法,触发器跟插入 修改 删除等动作紧紧的联系再一次,可能在我们

未来的修改发布中产生很多问题。那我现在告诉你一个及时查看修改表记录的方法。

1.修改数据库配置,允许数据库进行修改跟踪。

Alter Database RDCC
set change_tracking = on
(change_retention = 2 days, auto_cleanup = on);

复制代码

数据库修改跟踪权限开启了,不是所有表的跟踪权限都开启了,每个表还必须单独开启。

2.首先我们建一个简单的表然后插入几条记录。

Create table Employee
(
EmployeeID nvarchar(10) primary key,
FirstName nvarchar(100),
LastName nvarchar(100),
Phone1 nvarchar(10)
)

insert into Employee (EmployeeID,FirstName,LastName,Phone1) Values ('E001','Santosh','Poojari','1111111111')
insert into Employee (EmployeeID,FirstName,LastName,Phone1) Values ('E002','Karan','Shah','2222222222')
insert into Employee (EmployeeID,FirstName,LastName,Phone1) Values ('E003','Vineesh','Padmanabhan','3333333333')
insert into Employee (EmployeeID,FirstName,LastName,Phone1) Values ('E004','Gautam','Sharma','4444444444')

复制代码

在数据库允许跟踪之后,我们还必须把把表设置成可跟踪。

ALTER TABLE Employee ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = ON);

那么现在我们开始跟踪表的修改

update employee set Phone1 ='12121212' where EmployeeID ='E001'
update employee set Phone1 ='21212121' where EmployeeID ='E002'

复制代码

然后我们查看修改记录:

SELECT ISNUll(pn.EmployeeID,0) as EmployeeID
from changetable(changes employee, 1) as ct
INNER JOIN employee pn on pn.EmployeeID = CT.EmployeeID
WHERE SYS_CHANGE_VERSION &gt; 1 and CT.Sys_Change_Operation <>'D'

复制代码

我们看到的是employee表修改过的EmployeeID对应的行值。

下面我们看看整个修改记录:

SELECT *
from changetable(changes employee, 1) as ct
INNER JOIN employee pn on pn.EmployeeID = CT.EmployeeID
WHERE SYS_CHANGE_VERSION &gt; 1 and CT.Sys_Change_Operation <> 'D'

复制代码

列SYS_CHANGE_OPERATION显示的是操作类型,那么我们再做一条插入操作并查看结果:

insert into Employee (EmployeeID,FirstName,LastName,Phone1) Values ('E006','S','G','555555')

GO

SELECT *
from changetable(changes employee, 1) as ct
INNER JOIN employee pn on pn.EmployeeID = CT.EmployeeID
WHERE SYS_CHANGE_VERSION &gt; 1 and CT.Sys_Change_Operation <> 'D'

复制代码

那么我们看到SYS_CHANGE_OPERATION多了一条插入记录类型为I.那么数据库表的任意改动我们都可以通过代码跟踪到。而且一个修改记录的即(sys_change_version)从创建开始,会在系统表里保存两天。

有错误的地方欢迎大家拍砖,希望交流和共享。