申明本博客轉至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 > 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 > 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 > 1 and CT.Sys_Change_Operation <> 'D'
那么我們看到SYS_CHANGE_OPERATION多了一條插入記錄類型為I.那么數據庫表的任意改動我們都可以通過代碼跟蹤到。而且一個修改記錄的即(sys_change_version)從創建開始,會在系統表里保存兩天。