SQL Server審計功能入門:更改跟蹤(Change Tracking)


介紹

       更改跟蹤是一種輕量型解決方案,它為應用程序提供了一種有效的更改跟蹤機制。常規的,自定義變更跟蹤和讀取跟蹤數據,會使用觸發器,存儲過程和記錄變更的用戶表等,

還需要保證訪問一致和相關清理工作。 使用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
alter table sometable 

enable change_tracking 

go
3. 使用 CHANGETABLE 函數查看CT數據。SYS_CHANGE_VERSION是 庫中任何行的變改的最新版本號。

   返回行的最新更改數據:

SELECT t.* 

      , ct.* 

FROM dbo.SomeTable t 

CROSS APPLY CHANGETABLE(VERSION dbo.SomeTable, (ID), (t. ID)) AS ct;
   返回指定last_sync_versiion 改變的數據:
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

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)
5. 查詢CT列的變更數據

    使用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只能記錄最終值,所以實際應用中用得不多,只適用於特定場景。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM