SQL Server 更改跟蹤(Chang Tracking)監控表數據

一.本文所涉及的內容(Contents)

  1. 本文所涉及的內容(Contents)
  2. 背景(Contexts)
  3. 主要區別與對比(Compare)
  4. 實現監控表數據步驟(Process)
  5. 參考文獻(References)

二.背景(Contexts)

  在SQL Server 2008以上版本中,對數據庫中的用戶表所作的 DML 更改(插入、更新和刪除操做)除了:SQL Server 變動數據捕獲(CDC)監控表數據以外,還有一個新增功能,那就是:更改跟蹤(Chang Tracking),它跟CDC有什麼不一樣呢?使用場景有什麼區別呢?html

三.主要區別與對比(Compare)

1. SQL Server 2008 引入了兩項跟蹤功能:變動數據捕獲和更改跟蹤,以使應用程序可以肯定對數據庫中的用戶表所作的 DML 更改(插入、更新和刪除操做);sql

2. 若是應用程序須要有關全部所作更改的信息以及所更改數據的中間值,則可能適合使用變動數據捕獲,而不適合使用更改跟蹤。有關詳細信息,請參閱比較變動數據捕獲和更改跟蹤變動數據捕獲數據庫

3. 變動數據捕獲使用異步進程捕獲,此進程讀取事務日誌;更改跟蹤是與DML操做同步的,不須要讀取事務日誌;異步

4. 變動數據捕獲包含了變動的歷史記錄,更改跟蹤只保存行,但不會捕獲更改的數據;測試

更改跟蹤能夠根據外部傳入的應用程序上下文,來完成更細顆粒度的更改處理,參考:WITH CHANGE_TRACKING_CONTEXTspa

四.實現監控表數據步驟(Process)

/******* Step1:建立示例數據庫*******/
USE MASTER
GO
IF EXISTS(SELECT name FROM sys.databases WHERE name = 'CT_DB')
DROP DATABASE CT_DB
GO
CREATE DATABASE CT_DB
GO

 

(二) 開啓數據庫更改跟蹤Chang Tracking,經過下面的SQL腳本能夠查詢開啓了更改跟蹤的數據庫列表;.net

/******* Step2:開啓數據庫更改跟蹤Chang Tracking *******/
--啓用更改跟蹤(Chang Tracking),天清理一次(HOURS)
ALTER DATABASE CT_DB
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS,
AUTO_CLEANUP = ON)

--查看數據庫是否啓用更改跟蹤
SELECT DB_NAME(database_id) DataBaseName,is_auto_cleanup_on,
retention_period,retention_period_units_desc
FROM sys.change_tracking_databases

wps_clip_image-12450

(Figure1:查看數據庫是否啓用更改跟蹤)3d

 

(三) 開啓數據庫更改跟蹤Chang Tracking,經過下面的SQL腳本能夠查詢開啓了更改跟蹤的數據庫列表;日誌

/******* Step3:對錶啓用更改跟蹤*******/
--建立測試表
USE CT_DB
GO
CREATE TABLE [dbo].[Department](
    [DepartmentID] [smallint] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](200) NULL,
    [GroupName] [nvarchar](50) NOT NULL,
    [ModifiedDate] [datetime] NOT NULL,
    [AddName] [nvarchar](120) NULL,
 CONSTRAINT [PK_Department_DepartmentID] PRIMARY KEY CLUSTERED 
(
    [DepartmentID] ASC
) ON [PRIMARY]
) ON [PRIMARY]
GO

--對錶啓用更改跟蹤
ALTER TABLE  [dbo].[Department]
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON)

--查看錶是否啓用更改跟蹤
SELECT OBJECT_NAME(object_id) TableName,is_track_columns_updated_on
FROM sys.change_tracking_tables

wps_clip_image-20661

(Figure2:查看錶是否啓用更改跟蹤)code

 

(四) 測試對Department表進行DML操做:分兩次把數據插入到表,並使用下面的SQL腳本查看變動跟蹤信息,從中能夠發現,兩次不一樣的插入會生成兩個版本,這能夠證實變動跟蹤是跟DML操做是同步的;

/******* Step4:測試DML變動跟蹤*******/
--測試插入數據(版本將變成1)
INSERT  INTO dbo.Department(
    Name ,
    GroupName ,
    ModifiedDate
)VALUES('Marketing','Sales and Marketing',GETDATE())

--再次測試插入數據(版本將變成2)
INSERT  INTO dbo.Department(
    Name ,
    GroupName ,
    ModifiedDate
)VALUES
('Production','Manufacturing',GETDATE()),
('Purchasing','Inventory Management',GETDATE())

--表記錄
SELECT * FROM dbo.Department
--當前版本
SELECT CHANGE_TRACKING_CURRENT_VERSION ()
AS CURRENT_VERSION
--最小版本
SELECT CHANGE_TRACKING_MIN_VALID_VERSION
(OBJECT_ID('dbo.Department')) AS MIN_VERSION
--使用Changes關鍵字查看更改信息
SELECT DepartmentID,SYS_CHANGE_OPERATION,SYS_CHANGE_VERSION
FROM CHANGETABLE(CHANGES dbo.Department, 0) AS CT

wps_clip_image-13828

(Figure3:更改跟蹤信息)

 

(五) 繼續測試對Department表進行DML操做:作一次Update操做、作一次Delete操做;

--測試更新數據(版本將變成3)
UPDATE dbo.Department SET Name = 'Marketing Group',ModifiedDate = GETDATE()
WHERE Name = 'Marketing'
--測試刪除數據(版本將變成4)
DELETE FROM dbo.Department WHERE Name='Production'

--表記錄
SELECT * FROM dbo.Department
--當前版本
SELECT CHANGE_TRACKING_CURRENT_VERSION ()
AS CURRENT_VERSION
--最小版本
SELECT CHANGE_TRACKING_MIN_VALID_VERSION
(OBJECT_ID('dbo.Department')) AS MIN_VERSION
--查看版本2以後的更改
SELECT DepartmentID,SYS_CHANGE_OPERATION,SYS_CHANGE_VERSION,SYS_CHANGE_COLUMNS
FROM CHANGETABLE(CHANGES dbo.Department, 2) AS CT

wps_clip_image-7154

(Figure4:更改跟蹤信息)

 

(六) 查看列變動說明;

--返回哪些列被修改,1爲真,0爲假
SELECT DepartmentID,
CHANGE_TRACKING_IS_COLUMN_IN_MASK(
COLUMNPROPERTY(
OBJECT_ID('dbo.Department'),'Name', 'ColumnId') ,
SYS_CHANGE_COLUMNS) '是否改變Name',
CHANGE_TRACKING_IS_COLUMN_IN_MASK(
COLUMNPROPERTY(
OBJECT_ID('dbo.Department'),'GroupName', 'ColumnId') ,
SYS_CHANGE_COLUMNS) '是否改變GroupName',
CHANGE_TRACKING_IS_COLUMN_IN_MASK(
COLUMNPROPERTY(
OBJECT_ID('dbo.Department'), 'ModifiedDate', 'ColumnId') ,
SYS_CHANGE_COLUMNS) '是否改變ModifiedDate'
FROM CHANGETABLE(CHANGES dbo.Department, 2) AS CT
WHERE SYS_CHANGE_OPERATION = 'U'

wps_clip_image-13637

(Figure5:列變動說明)

 

(七) 使用Version關鍵字查看更改信息;

--使用Version關鍵字查看更改信息
SELECT *
FROM dbo.Department d
CROSS APPLY CHANGETABLE(VERSION dbo.Department, (DepartmentID), (d.DepartmentID)) AS ct

wps_clip_image-8676

(Figure6:Version關鍵字查看更改信息)

 

(八) 經過在外部應用程序中的上下文信息判斷這個DML是由哪一個應用產生的;

--設置跟蹤外部程序上下文信息
DECLARE @context VARBINARY(128) = CAST('我要插入記錄' AS VARBINARY(128));
WITH CHANGE_TRACKING_CONTEXT (@context)
--測試插入數據(版本將變成)
INSERT  INTO dbo.Department(
    Name ,
    GroupName ,
    ModifiedDate
)VALUES('Document Control','Quality Assurance',GETDATE())

--查詢Context更改
SELECT DepartmentID,SYS_CHANGE_OPERATION,SYS_CHANGE_VERSION,
CAST(SYS_CHANGE_CONTEXT AS VARCHAR) ApplicationContext
FROM CHANGETABLE(CHANGES dbo.Department, 4) AS CT

wps_clip_image-9332

(Figure7:上下文信息)

 

(九) 獲取更改跟蹤版本2以後的表數據;

--獲取更改跟蹤版本2以後的表數據
SELECT SYS_CHANGE_OPERATION,SYS_CHANGE_VERSION,SYS_CHANGE_COLUMNS,D.*
FROM CHANGETABLE(CHANGES dbo.Department, 2) AS CT
LEFT JOIN dbo.Department AS D
ON CT.DepartmentID = D.DepartmentID

wps_clip_image-11505

(Figure8:更改表記錄)

 

(十) 總結:在更改跟蹤的記錄中包括了表Department 的惟一編號,還有DML的操做符字段SYS_CHANGE_OPERATION,枚舉這些值(I=Insert、U=Update、D=Delete),還有DML操做的版本號:SYS_CHANGE_VERSION,它是每進行一次DML,都會遞增一個版本號,因此你能夠針對I=Insert、U=Update、D=Delete不一樣的類型加上版本號過濾,就能夠找到那些數據進行了更新;

五.參考文獻(References)

SQL Server 2008中新增的變動數據捕獲(CDC)和更改跟蹤

跟蹤數據更改

Oracle 同樣可以Flashback

相關文章
相關標籤/搜索