適用於:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric 中的 SQL 資料庫
本文說明如何管理變更追蹤。 此外,本主題也會描述如何設定安全性,以及判斷使用變更追蹤對儲存和效能產生的影響。
管理變更追縱
下列各節將列出與管理變更追蹤有關的目錄檢視、權限和設定。
目錄檢視
若要判斷哪些資料表和資料庫已啟用變更追蹤,您可以使用下列目錄檢視:
此外,當針對使用者資料表啟用變更追蹤時, 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, or 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'