Cdc。 <>capture_instance_CT (Transact-SQL)
適用於:SQL ServerAzure SQL DatabaseAzure 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) 。
識別資料 行定義為 int 或 Bigint 。
不過,這些資料行中的值與來源資料行值相同。
大型物件資料類型
當 __$operation = 1 或 __$operation = 3 時,資料型 別 image 、 text 和 Ntext 的資料行一律會 指派 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 變更的記錄檔記錄時,會修改變更資料表中已擷取資料行的資料類型。
如果您需要在來源資料表中修改所擷取資料行的資料類型,以減少資料類型的大小,請使用下列程式來確保變更資料表中的對等資料行可以成功修改。
在來源資料表中,更新要修改的資料行值,以符合計畫的資料型別大小。 例如,如果您將資料類型從 int 變更為 Smallint,請將值更新為符合 Smallint 範圍的大小,-32,768 到 32,767。
在變更資料表中,對對等資料行執行相同的更新作業。
藉由指定新的資料類型來改變來源資料表。 資料類型變更已成功傳播至變更資料表。
資料操作語言修改
在啟用異動資料擷取的來源資料表上執行插入、更新和刪除作業時,這些 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)
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應