共用方式為


cdc。<>capture_instance_CT (Transact-SQL)

適用於:SQL ServerAzure SQL 資料庫 Azure SQL 受控執行個體

在源數據表上啟用異動數據擷取時所建立的變更數據表。 數據表會針對針對源數據表執行的每個插入和刪除作業傳回一個數據列,以及針對源數據表所執行之每個更新作業的兩個數據列。 當啟用源數據表時未指定變更數據表的名稱時,就會衍生名稱。 名稱的格式為 cdc。capture_instance_CT其中capture_instance是源數據表的架構名稱,以及格式為源數據表名稱schema_table。 例如,如果 AdventureWorks 範例資料庫中的數據表 Person.Address 已啟用異動數據擷取,則衍生的變更數據表名稱會cdc.Person_Address_CT

建議您 不要直接查詢系統數據表。 請改為執行 cdc.fn_cdc_get_all_changes_<capture_instance>cdc.fn_cdc_get_net_changes_<capture_instance> 函式。

資料行名稱 資料類型 描述
__$start_lsn binary(10) 與變更之認可交易相關聯的記錄序號 (LSN)。

在相同交易中認可的所有變更都會共用相同的認可 LSN。 例如,如果源數據表上的刪除作業移除兩個數據列,則變更數據表會包含兩個數據列,每個數據列都有相同的 __$start_lsn 值。
__$end_lsn binary(10) 僅供參考之用。 不支援。 我們無法保證未來的相容性。

在 SQL Server 2012 (11.x) 中,此數據行一律為 NULL。
__$seqval binary(10) 在事務歷史記錄中表示的作業順序。 不應該用於排序。 請改用 __$command_id 數據行。
__$operation int 識別與變更相關聯的數據操作語言 (DML) 作業。 可以是下列其中一項:

1 = 刪除

2 = 插入

3 = update (舊值)

數據行數據在執行 update 語句之前具有數據列值。

4 = 更新 (新值)

數據行數據在執行 update 語句之後具有數據列值。
__$update_mask varbinary(128) 根據變更數據表的數據行序數來識別已變更之數據行的位遮罩。
<擷取的來源資料表資料行> 視情況而異 變更數據表中的其餘數據行是源數據表中的數據行,在建立擷取實例時識別為擷取的數據行。 如果未在擷取的數據行清單中指定任何數據行,源數據表中的所有數據行都會包含在此數據表中。
__$command_id int 追蹤交易內的作業順序。

備註

數據 __$command_id 行是在 2012 到 2016 版的累積更新中引進的。 如需版本和下載資訊,請參閱 FIX 中的 知識庫文章3030352:當您為 Microsoft SQL Server 資料庫啟用異動數據擷取之後,變更數據表會針對更新的數據列排序不正確。 如需詳細資訊,請參閱 CDC 功能升級至 SQL Server 2012、2014 和 2016 的最新 CU 之後可能會中斷。

擷取的數據行數據類型

此數據表中包含的擷取數據行具有與其對應源數據行相同的數據類型和值,但有下列例外狀況:

  • 時間戳 數據行定義為 binary(8)

  • 識別數據 行定義為 intbigint

不過,這些數據行中的值與源數據行值相同。

大型物件數據類型

當 __$operation = 1 或 __$operation = 3 時,數據型 別 imagetextntext 的數據行一律會 指派 NULL 值。 除非數據行在更新期間變更,否則數據類型 varbinary(max)varchar(max)nvarchar(max) 的數據行會在 __$operation = 3 時指派 NULL 值。 當 __$operation = 1 時,這些數據行會在刪除時指派其值。 擷取實例中包含的計算數據行一律具有NULL

根據預設,單一 INSERT、UPDATE、WRITETEXT 或 UPDATETEXT 語句中可新增至所擷取數據行的大小上限為 65,536 位元組或 64 KB。 若要增加此大小以支援較大的 LOB 數據,請使用 [ 設定最大文字重載大小伺服器組態選項 ] 來指定較大的大小上限。 如需詳細資訊,請參閱 設定 max text repl size 伺服器組態選項

數據定義語言修改

源數據表的 DDL 修改,例如加入或卸除數據行,會記錄在cdc.ddl_history數據表中。 這些變更不會套用至變更數據表。 也就是說,變更數據表的定義會維持不變。 將數據列插入變更數據表時,擷取程式會忽略未出現在與源數據表相關聯之擷取數據行清單中的數據行。 如果數據行出現在已擷取的數據行清單中,該數據行已不再出現在源數據表中,則會指派 Null 值。

變更源數據表中數據行的數據類型也會記錄在cdc.ddl_history數據表中。 不過,這項變更會改變變更數據表的定義。 當擷取程式遇到對源數據表進行 DDL 變更的記錄檔記錄時,會修改變更數據表中已擷取數據行的數據類型。

如果您需要在源數據表中修改所擷取數據行的數據類型,以減少數據類型的大小,請使用下列程式來確保變更數據表中的對等數據行可以成功修改。

  1. 在源數據表中,更新要修改的數據行值,以符合計劃的數據型別大小。 例如,如果您將數據類型從 int 變更為 smallint,請將值更新為符合 smallint 範圍的大小,-32,768 到 32,767。

  2. 在變更數據表中,對對等數據行執行相同的更新作業。

  3. 藉由指定新的數據類型來改變源數據表。 數據類型變更已成功傳播至變更數據表。

數據操作語言修改

在啟用異動數據擷取的源數據表上執行插入、更新和刪除作業時,這些 DML 作業的記錄會出現在資料庫事務歷史記錄中。 異動數據擷取程式會從事務歷史記錄擷取這些變更的相關信息,並將一或兩個數據列新增至變更數據表以記錄變更。 專案會以認可至源數據表的順序新增至變更數據表。 也就是說,變更數據表項目的認可通常必須在一組變更上執行,而不是針對每個項目執行。

插入作業會導致新增至變更數據表的一個數據列;刪除作業會導致新增至變更數據表的一個數據列;如果 SQL Server 將更新實作為「延遲更新」,這表示做為一對刪除和插入作業,更新作業會產生兩個新增至變更數據表的數據列:反映刪除所擷取數據的第一個數據列,以及反映插入更新、擷取數據的第二個數據列:如果 SQL Server 未將更新實作為「延遲更新」,則更新作業會產生兩個新增至變更數據表的數據列:第一個數據列會反映更新前擷取的數據,而第二個數據列則反映更新後所擷取的數據。

在變更數據表專案中, __$start_lsn 數據行是用來記錄與源數據表變更相關聯的認可 LSN、 __$command_id 數據行用來排序其交易內的變更,並使用 __$operation 數據行來記錄所執行的作業。 一起,這些元數據行可以用來確保保留來源變更的認可順序。 由於擷取程式會從事務歷史記錄中取得其變更資訊,因此請務必注意,變更數據表專案不會與其對應的源數據表變更同步出現。 相反地,在擷取程式處理事務歷史記錄的相關變更項目之後,對應的變更會以異步方式出現。

針對插入和刪除作業,會設定更新遮罩中的所有位。 針對更新作業,將會修改更新舊數據列和更新新數據列中的更新遮罩,以反映更新期間變更的數據行。

另請參閱

sys.sp_cdc_enable_table (Transact-SQL)
sys.sp_cdc_get_ddl_history (Transact-SQL)