設定和管理變更追蹤
此主題描述如何啟用、停用和管理變更追蹤。此外,它也會描述如何設定安全性,以及判斷使用變更追蹤對儲存和效能產生的影響。
為資料庫啟用變更追蹤
在您可以使用變更追蹤之前,必須先在資料庫層級啟用變更追蹤。下列範例將示範如何使用 ALTER DATABASE 來啟用變更追蹤:
ALTER DATABASE AdventureWorks2008R2
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);
您也可以使用資料庫屬性 (變更追蹤頁面) 對話方塊,以啟用 SQL Server Management Studio 中的變更追蹤。
當您啟用變更追蹤時,可以指定 CHANGE_RETENTION 和 AUTO_CLEANUP 選項,而且您可以在啟用變更追蹤之後的任何時間變更這些值。
變更保留值會指定保存變更追蹤資訊的期間。早於此期間的變更追蹤資訊會定期遭到移除。當您設定這個值時,應該考量應用程式與資料庫資料表同步處理的頻率。指定的保留期間至少必須與同步處理之間的期間上限一樣長。如果應用程式在較長的間隔上取得變更,所傳回的結果可能會不正確,因為變更資訊的某部分可能已遭到移除。為了避免取得不正確的結果,應用程式可以使用 CHANGE_TRACKING_MIN_VALID_VERSION 系統函數來判斷同步處理之間的間隔是否已經過長。
您可以使用 AUTO_CLEANUP 選項來啟用或停用移除老舊變更追蹤資訊的清除工作。當有暫時性的問題阻礙應用程式同步處理時,這樣的處理方式會很實用,而且在問題解決之前,必須先暫停用來移除早於保留期間之變更追蹤資訊的程序。
如果是使用變更追蹤的任何資料庫,請注意以下事項:
若要使用變更追蹤,資料庫相容性層級必須設定為 90 以上 (含)。如果資料庫的相容性層級低於 90,您也可以設定變更追蹤。不過,用來取得變更追蹤資訊的 CHANGETABLE 函數將會傳回錯誤。
若要確保所有變更追蹤資訊都一致,使用快照隔離是最簡單的方式。基於這個原因,我們強烈建議您將資料庫的快照隔離設定為 ON。如需詳細資訊,請參閱<使用變更追縱>。
為資料表啟用變更追蹤
您必須針對您要追蹤的每一個資料表啟用變更追蹤。啟用變更追蹤時,系統會針對資料表中受到 DML 作業影響的所有資料列維護變更追蹤資訊。
下列範例示範如何使用 ALTER TABLE 來為資料表啟用變更追蹤:
ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON);
您也可以使用資料表屬性 (變更追蹤頁面) 對話方塊,以啟用 SQL Server Management Studio 中的資料表變更追蹤。
當 TRACK_COLUMNS_UPDATED 選項設定為 ON 時,SQL Server Database Engine 會將哪些資料行已更新的相關額外資訊儲存到內部變更追蹤資料表。資料行追蹤只能讓應用程式同步處理已經更新的那些資料行。這樣可以改善效率與效能。但是,由於維護資料行追蹤資訊會增加額外的儲存負擔,所以此選項預設為 OFF。
停用變更追縱
在可以針對資料庫將變更追縱設定為 OFF 之前,必須先針對所有變更追蹤的資料表停用變更追蹤。若要判斷已針對資料庫啟用變更追蹤的資料表,請使用 sys.change_tracking_tables 目錄檢視。
下列範例示範如何使用 ALTER TABLE 來為資料表停用變更追蹤:
ALTER TABLE Person.Person
DISABLE CHANGE_TRACKING;
當資料庫中沒有任何資料表追蹤變更時,您可以為此資料庫停用變更追蹤。下列範例將示範如何使用 ALTER DATABASE 來為資料庫停用變更追蹤:
ALTER DATABASE AdventureWorks2008R2
SET CHANGE_TRACKING = OFF;
管理變更追縱
下列章節列出與管理變更追蹤有關的目錄檢視、權限和設定。
目錄檢視
若要判斷哪些資料表和資料庫已啟用變更追蹤,您可以使用下列目錄檢視:
此外,當針對使用者資料表啟用變更追蹤時,sys.internal_tables 目錄檢視也會列出所建立的內部資料表。
安全性
若要使用變更追蹤函數來存取變更追蹤資訊,主體必須具有以下權限:
在所查詢的資料表上,變更追蹤資料表上至少具有主索引鍵資料行的 SELECT 權限。
要取得變更之資料表上的 VIEW CHANGE TRACKING 權限。需要 VIEW CHANGE TRACKING 權限的原因如下:
變更追蹤記錄包含已刪除之資料列的相關資訊,特別是已刪除之資料列的主索引鍵值。在刪除某些敏感性資料之後,主體可能已經被授與變更追蹤資料表的 SELECT 權限。在此情況下,您不想讓該主體能夠使用變更追蹤來存取已刪除的資訊。
變更追蹤資訊可儲存有關更新作業已變更哪些資料行的資訊。當資料行包含敏感性資訊時,可能會拒絕主體對此資料行的存取權限。不過,由於可使用變更追蹤資訊,所以主體可以判斷資料行值已經更新,但是主體無法判斷此資料行的值。
了解變更追蹤負擔
在針對資料表啟用變更追蹤時,某些管理作業會受到影響。下表將列出這些作業以及您應該考量的影響。
作業 |
啟用變更追蹤時 |
---|---|
DROP TABLE |
針對卸除的資料表移除了所有變更追蹤資訊。 |
ALTER TABLE DROP CONSTRAINT |
嘗試卸除 PRIMARY KEY 條件約束但卻失敗。在可以卸除 PRIMARY KEY 條件約束之前,必須先停用變更追蹤。 |
ALTER TABLE DROP COLUMN |
如果所卸除的資料行屬於主索引鍵的一部分,則不允許卸除此資料行 (與變更追蹤無關)。 如果所卸除的資料行不屬於主索引鍵的一部分,則卸除此資料行將會成功。但是,應該要先了解對同步處理此資料之任何應用程式的影響。如果已針對資料表啟用資料行變更追蹤,則仍然可能在變更追蹤資訊中傳回卸除的資料行。應用程式必須負責處理卸除的資料行。 |
ALTER TABLE ADD COLUMN |
如果新的資料行加入至變更追蹤資料表,系統不會追蹤資料行的加入作業。系統只會追蹤對新資料行所做的更新和變更。 |
ALTER TABLE ALTER COLUMN |
不會追蹤非主索引鍵資料行的資料類型變更。 |
ALTER TABLE SWITCH |
如果其中一個或兩個資料表已啟用變更追蹤,則切換資料分割會失敗。 |
DROP INDEX 或 ALTER INDEX DISABLE |
強制主索引鍵的索引無法加以卸除或停用。 |
TRUNCATE TABLE |
截斷資料表的作業可以在已啟用變更追蹤的資料表上執行。但是,不會追蹤此作業所刪除的資料列,而且會更新最小的有效版本。當應用程式檢查它的版本時,這項檢查會指示此版本太舊,而且需要重新初始化。這與針對資料表停用變更追蹤然後重新啟用相同。 |
使用變更追蹤並不會對 DML 作業造成額外負擔,因為變更追蹤資訊會儲存成作業的一部分。
對 DML 的影響
變更追蹤已經最佳化,可讓 DML 作業的效能負擔降到最低。與在資料表上使用變更追蹤有關的累加效能負擔,類似於針對資料表建立索引而且需要進行維護時所產生的負擔。
對於 DML 作業變更的每一個資料列而言,會將一個資料列新增到內部變更追蹤資料表。這項作業 (相對於 DML 作業) 的影響取決於各種因素,如下列所示:
主索引鍵資料行的數目
在使用者資料表資料列中變更的資料數量
在交易中執行的作業數目
如果您使用了快照隔離,它也會影響所有 DML 作業的效能 (不論是否啟用變更追蹤)。
對儲存的影響
變更追蹤資料會儲存在下列內部資料表類型中:
內部變更資料表
啟用變更追蹤的每個使用者資料表都會有一個內部變更資料表。
內部交易資料表
每個資料庫都有一個內部交易資料表。
這些內部資料表會以下列方式來影響儲存需求:
對於使用者資料表內每一個資料列的每一項變更而言,會將一個資料列新增到內部變更資料表。這個資料列有少量固定的負擔,再加上等於主索引鍵資料行大小的變動負擔。此資料列可以包含應用程式所設定的選擇性內容資訊。此外,如果啟用了資料行追蹤,則每一個變更的資料行在追蹤資料表內都需要 4 個位元組。
針對每個認可的交易,內部交易資料表都會加入一個資料列。
如果是其他內部資料表,您可以使用 sp_spaceused 預存程序來判斷用於變更追蹤資料表的空間。您可以使用 sys.internal_tables 目錄檢視來取得內部資料表的名稱,如下列範例所示:
sp_spaceused 'sys.change_tracking_309576141';
sp_spaceused 'sys.syscommittab';