在SQL Server 2008中使用變更跟蹤獲得資料變更
資料變更需要與一個基線做對比。當你首先將你的客戶端(一個NET應用程式和/或另一個SQL Server表)與HumanResources.Department表同步時,你從這個表的所有記錄獲得一個原始的資料集。你還獲得基線版本數字,例如這時所有記錄的最大版本數字,並將它記錄下來用於下一次同步。下一次同步時,系統確定哪些記錄從這個基線版本以來進行了修改,而一個新的基線版本被儲存下來用於下次的同步。這個演算法如下所示。
-- Obtain the current synchronization version. This will be used the next time CHANGETABLE(CHANGES...) is called. SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION(); -- If this is the first synchronization session IF (@sync_initialized = 0) BEGIN -- Initialize from the table SELECT DepartmentID, Name, GroupName, ModifiedDate FROM HumanResources.Department END ELSE BEGIN -- Obtain incremental changes by using the synchronization version obtained the last time the data was synchronized. SELECT CT.SYS_CHANGE_OPERATION, DepartmentID, Name, GroupName, ModifiedDate FROM HumanResources.Department RIGHT OUTER JOIN CHANGETABLE(CHANGES HumanResources.Department, @last_synchronization_version) AS CT ON P.DepartmentID = CT.DepartmentID END |
DECLARE @synchronization_version bigint -- Obtain the current synchronization version. This will be used the next time CHANGETABLE(CHANGES...) is called. SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION() SELECT @synchronization_version -- Initialize from the base table SELECT DepartmentID, Name, GroupName, ModifiedDate FROM HumanResources.Department |
讓我們插入一條新的記錄到這個表中並更新一條已有的記錄。
INSERT INTO HumanResources.Department
(Name, GroupName, ModifiedDate)
VALUES ('Product Design', 'Research and Development', GETDATE())
UPDATE HumanResources.Department
SET GroupName='Accounting'
WHERE DepartmentID=10
要獲得上次版本0以來的變更,執行下面的指令碼。
DECLARE @synchronization_version bigint -- Obtain the current synchronization version. This will be used the next time CHANGETABLE(CHANGES...) is called. SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION() SELECT @synchronization_version -- Obtain incremental changes by using the synchronization version obtained the last time the data was synchronized. SELECT CT.SYS_CHANGE_VERSION, CT.SYS_CHANGE_OPERATION, CT.DepartmentID, Name, GroupName, ModifiedDate FROM HumanResources.Department D RIGHT OUTER JOIN CHANGETABLE(CHANGES HumanResources.Department, 0) AS CT ON D.DepartmentID = CT.DepartmentID |
如果你在表HumanResources.Department 上啟用了欄位跟蹤,那麼你可以只從變更了的欄位獲取資料。
DECLARE @synchronization_version bigint -- Obtain the current synchronization version. This will be used the next time CHANGETABLE(CHANGES...) is called. SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION() SELECT @synchronization_version -- Obtain incremental changes by using the synchronization version obtained the last time the data was synchronized. SELECT CT.SYS_CHANGE_VERSION, CT.SYS_CHANGE_OPERATION, CT.DepartmentID, CASE CHANGE_TRACKING_IS_COLUMN_IN_MASK (COLUMNPROPERTY(OBJECT_ID('HumanResources.Department'), 'Name', 'ColumnId'), SYS_CHANGE_COLUMNS) WHEN 1 THEN Name ELSE NULL END as Name, CASE CHANGE_TRACKING_IS_COLUMN_IN_MASK(COLUMNPROPERTY (OBJECT_ID('HumanResources.Department'), 'GroupName', 'ColumnId'), SYS_CHANGE_COLUMNS) WHEN 1 THEN GroupName ELSE NULL END AS GroupName, ModifiedDate FROM HumanResources.Department D RIGHT OUTER JOIN CHANGETABLE(CHANGES HumanResources.Department, 0) AS CT ON D.DepartmentID = CT.DepartmentID |
讓我們刪除新新增的記錄。
DELETE FROM HumanResources.Department WHERE DepartmentID=17 要獲得從上次版本2以來的變更,執行之前的指令碼,使用新版本2。 DECLARE @synchronization_version bigint -- Obtain the current synchronization version. This will be used the next time CHANGETABLE(CHANGES...) is called. SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION() SELECT @synchronization_version -- Obtain incremental changes by using the synchronization version obtained the last time the data was synchronized. SELECT CT.SYS_CHANGE_VERSION, CT.SYS_CHANGE_OPERATION, CT.DepartmentID, Name, GroupName, ModifiedDate FROM HumanResources.Department D RIGHT OUTER JOIN CHANGETABLE(CHANGES HumanResources.Department, 2) AS CT ON D.DepartmentID = CT.DepartmentID |
因為如果AUTO_CLEANUP選項設定為開啟,那麼變更跟蹤資訊可以在下次同步執行之前被刪除,我們還需要將@last_synchronization_version和用於特定表的變更跟蹤表中儲存的最小版本相比較。如果@last_synchronization_version小於CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('HumanResources.Department')),那麼我們需要重新初始化並獲得一個包含HumanResources.Department base表所有記錄的新基線。因此,這個條件
IF (@sync_initialized = 0)
需要改為
IF (@last_synchronization_version 在一個繁忙的系統上,在獲得當前版本和從CHANGETABLE()函式獲得變更之間,表HumanResources.Department 有可能被其它會話改變,或變更跟蹤資訊可能被清理程式刪除了並啟動CHANGE_TRACKING_MIN_VALID_VERSION來新增。因此,最好使用快照隔離來確保在事務過程中所有的變更跟蹤資訊是一致的。完整的演算法如下所示。
在資料庫上啟用快照隔離會對資料庫增加不小的效能成本。如果你傾向於不使用快照隔離,那麼一個獲得變更的替代演算法如下所示。
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
BEGIN TRAN
DECLARE @synchronization_version bigint
-- Obtain the current synchronization version. This will be used the next time CHANGETABLE(CHANGES...) is called.
SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION()
SELECT @synchronization_version
IF (@last_synchronization_version BEGIN
-- Initialize from the base table
SELECT DepartmentID, Name, GroupName, ModifiedDate
FROM HumanResources.Department
END
ELSE
BEGIN
-- Obtain incremental changes by using the synchronization version obtained the last time the data was synchronized.
SELECT CT.SYS_CHANGE_OPERATION, CT.DepartmentID, Name, GroupName, ModifiedDate
FROM HumanResources.Department D
RIGHT OUTER JOIN
CHANGETABLE(CHANGES HumanResources.Department, @last_synchronization_version) AS CT
ON
D.DepartmentID = CT.DepartmentID
END
COMMIT TRAN
DECLARE @synchronization_version bigint SET @synchronization_version = CHANGE_TRACKING_CURRENT_VERSION() SELECT @synchronization_version IF (@last_synchronization_version -- Initialize from the base table SELECT DepartmentID, Name, GroupName, ModifiedDate FROM HumanResources.Department ELSE BEGIN -- Obtain incremental changes by using the synchronization version obtained the last time the data was synchronized. SELECT CT.SYS_CHANGE_OPERATION, CT.DepartmentID, Name, GroupName, ModifiedDate FROM HumanResources.Department D RIGHT OUTER JOIN CHANGETABLE(CHANGES HumanResources.Department, @last_synchronization_version) AS CT ON D.DepartmentID = CT.DepartmentID WHERE (CT.SYS_CHANGE_CREATION_VERSION <= @synchronization_version) END |
總結
本篇文章介紹了怎樣使用CHANGETABLE函式來獲取資料變更。展示了兩個演算法。你可以在你的.NET應用程式中使用Sync Services來執行這兩個演算法。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-630024/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SQL Server 變更資料捕獲(CDC)SQLServer
- [Kogel.Subscribe.Mssql]SQL Server增量訂閱,資料庫變更監聽SQLServer資料庫
- 【SQL】Oracle資料庫變更後sql效能對比SQLOracle資料庫
- Oracle CDC 變更資料捕獲技術Oracle
- DataGear 變更部署資料庫為SQL Server填坑指南(含轉寫後的SQL server程式碼及SQL server配置檔案)資料庫SQLServer
- C++ 必須變得更安全C++
- Airbnb的變更資料捕獲系統,實現資料突變實時響應AI
- Minitab 2021:讓資料分析變得更簡單,更直觀 win版
- 變更資料捕獲CDC幾種應用場景 - RTInsights
- 變更資料捕獲CDC的八個實際案例 - Dunith
- LiquiBase 管理資料庫變更實踐UI資料庫
- Science:吃魚真的可以變得更聰明!
- OpenShift 與 OpenStack:讓雲變得更簡單
- Oracle資料庫跟蹤SQLOracle資料庫SQL
- 使用Spring Cloud Data Flow + CDC Debezium源實時實現變更資料捕獲 - SpringIOSpringCloud
- WPF自定義Panel:讓拖拽變得更簡單
- Smartour——讓網頁導覽變得更簡單網頁
- 變更性別--使用if 交換值
- Avdshare Video Converter,讓影片轉換變得更簡單!IDE
- 如何讓 Emacs 俄羅斯方塊變得更難Mac
- 讓動畫變得更簡單之FLIP技術動畫
- 2022 開源之夏 | Serverless Devs 陪你“變得更強”Serverdev
- SOM:研究發現導航 App 在讓城市交通變得更擁堵APP
- 益華世科技域名變更公告 域名變更 www.evash.top
- 『研究發現導航 App 在讓城市交通變得更擁堵』今日資料行業日報(2019.11.26)APP行業
- 高效的Mobx模式(Part 2 - 掌握資料變更方法)模式
- 變更OS時間對資料庫的影響資料庫
- DBus資料庫表結構變更處理方案資料庫
- 資料變更白屏化利器-推送軌跡上線
- Python裝飾器:套層殼我變得更強了!Python
- Poka-Yoke讓失敗變得比成功更難 - reflectoring
- Spring Boot 2 實戰:使用 Flyway 管理你資料庫的版本變更Spring Boot資料庫
- SQL Server CDC配合Kafka Connect監聽資料變化SQLServerKafka
- 資料庫系列:高併發下的資料欄位變更資料庫
- DataGrip 2023:讓資料庫開發變得更簡單、更高效 mac/win啟用版資料庫Mac
- Android P 加密程式變更Android加密
- 智簡魔方DCIM系統如何讓資料中心管理變得更簡單
- RubyMine 2023: 讓Ruby開發變得更簡單 mac/win版Mac
- LEARUN快速開發平臺,讓開發變得更簡單