介紹
?????? 更改跟蹤是一種輕量型解決方案,它為應用程序提供了一種有效的更改跟蹤機制。常規的,自定義變更跟蹤和讀取跟蹤數據,會使用觸發器,存儲過程和記錄變更的用戶表等,
還需要保證訪問一致和相關清理工作。 使用CT會減少額外工作量和保證訪問一致性。
啟用CT的表上必須得有主鍵,所有版本適用。為了保證更改信息的有效性,官方建議結合快照隔離使用。
CT只能提供:
??????????????????? 哪些行/列發生了更改
??????????????????? 被更改行的最新數據。
不能提供 :更改發生的次數,中間值。
應用 :離線緩存的更新,ETL更新
注意事項 :
????????????????? 1. 寫入變更到變更記錄表,所以執行計劃會多一個操作符,增加開銷。
????????????????? 2. 每個啟用CT的表會創建一個內部更改表。
????????????????? 3. 對于用戶表中每行的每個更改,都會向內部更改表中添加一行。? 該行有一個較小的固定開銷,外加一個大小等于主鍵列大小的可變開銷。
????????????????? 4. 對于每個已提交的事務,都會向內部事務表中添加一行。
實現
1. 在庫級別啟用CT
???????
alter database TestCT set change_tracking = on ( change_retention = 2 days, auto_cleanup = on )
2. 對要跟蹤的對象啟用CT
3. 使用 CHANGETABLE 函數查看CT數據 。SYS_CHANGE_VERSION是 庫中任何行 的變改的最新版本號。alter table sometable enable change_tracking go
?? 返回行的最新更改數據:
?? 返回指定last_sync_versiion 后 改變的數據:SELECT t. * , ct. * FROM dbo.SomeTable t CROSS APPLY CHANGETABLE(VERSION dbo.SomeTable, (ID), (t. ID)) AS ct;
DECLARE @version BIGINT = 2 ; SELECT t. * , ct. * FROM CHANGETABLE (CHANGES dbo.SomeTable, @version ) AS ct INNER JOIN dbo.SomeTable t ON t. ID = ct. ID Go
4. 對列啟用CT
5. 查詢CT列的變更數據CREATE TABLE dbo.NewTable ( ID INT NOT NULL IDENTITY ( 1 , 1 ) CONSTRAINT PK_NewTable PRIMARY KEY , BigColumn VARCHAR ( 255 ) NOT NULL , AnotherBigColumn VARCHAR ( 255 ) NOT NULL ) GO ALTER TABLE NewTable ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = ON )
??? 使用 CHANGE_TRACKING_IS_COLUMN_IN_MASK 結合CHANGETABLE
DECLARE @version BIGINT ; -- get previous version SELECT @version = CHANGE_TRACKING_CURRENT_VERSION() - 1 ; SELECT * , CHANGE_TRACKING_IS_COLUMN_IN_MASK( COLUMNPROPERTY ( OBJECT_ID ( ' dbo.NewTable ' ), ' BigColumn ' , ' COLUMNID ' ), CT.SYS_CHANGE_COLUMNS ) AS BigColumn_Changed, CHANGE_TRACKING_IS_COLUMN_IN_MASK( COLUMNPROPERTY ( OBJECT_ID ( ' dbo.NewTable ' ), ' AnotherBigColumn ' , ' COLUMNID ' ), CT.SYS_CHANGE_COLUMNS ) AS AnotherBigColumn_Changed FROM CHANGETABLE(CHANGES dbo.NewTable, @version ) AS CT INNER JOIN dbo.NewTable NT ON CT.ID = NT.ID
總結
??? 1. 所謂輕量,是相對的。CT仍需要記錄變更記錄,需要額外的開銷。
??? 2. CT只能記錄最終值,所以實際應用中用得不多,只適用于特定場景。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
