<cdc.fn_cdc_get_net_changes_capture_instance > (Transact-SQL)

適用於:SQL Server

針對指定之記錄序號 (LSN) 範圍內變更的每個來來源資料列,傳回一個淨變更資料列。

等一下,什麼是 LSN? SQL Server 交易記錄 中的每個 記錄都會以記錄序號 (LSN) 唯一識別。 LSN 的排序方式是,如果 LSN2 大於 LSN1,則 LSN2 所參考的記錄檔記錄所描述的變更發生在 記錄檔記錄 LSN 所描述的變更之後

記錄檔記錄的 LSN,其中發生重大事件有助於建構正確的還原順序。 因為 LSN 已排序,因此您可以比較它們是否相等和不等(也就是 < 、、 > =、 < =、 > =)。 建構還原順序時,這類比較很有用。

當來來源資料列在 LSN 範圍期間有多個變更時,列舉函式會傳回反映資料列最終內容的單一資料列。 例如,如果交易在來源資料表中插入資料列,而 LSN 範圍內的後續交易會更新該資料列中的一或多個資料行,則此函式只會 傳回一個 資料列,其中包含更新的資料行值。

當來源資料表啟用異動資料擷取和指定 Net 追蹤時,就會建立此列舉函數。 若要啟用網路追蹤,來源資料表必須具有主鍵或唯一索引。 函式名稱是衍生的,並使用 格式 cdc.fn_cdc_get_net_changes_<capture_instance> ,其中 < capture_instance > 是啟用異動資料擷取時,針對擷取實例指定的值。 如需詳細資訊,請參閱 sys.sp_cdc_enable_table (Transact-SQL)

Transact-SQL 語法慣例

語法

  
cdc.fn_cdc_get_net_changes_capture_instance ( from_lsn , to_lsn , '<row_filter_option>' )  
  
<row_filter_option> ::=  
{ all  
 | all with mask  
 | all with merge  
}  

引數

from_lsn

LSN,表示要包含在結果集中之 LSN 範圍的低端點。 from_lsn為 binary(10)

只有 cdc 中的資料 列。[capture_instance]_CT 在結果集中包含值 __$start_lsn大於或等於 from_lsn 的變更資料表。

to_lsn

LSN,表示要包含在結果集中之 LSN 範圍的高端點。 to_lsn binary(10)

只有 cdc 中的資料 列。[capture_instance]_CT 在 __$start_lsn 小於或等於from_lsn或等於 to_lsn 的值變更資料表會包含在結果集中。

<> row_filter_option ::= { all | all with mask | all with merge }

選項,可控管中繼資料行的內容,以及結果集中傳回的資料列。 可以是下列其中一個選項:

全部
傳回資料列最後變更的 LSN,以及在中繼資料行 __$start_lsn 和 __$operation 中套用資料列所需的作業。 資料行 __$update_mask一律為 Null。

全部含遮罩
傳回資料列最後變更的 LSN,以及在中繼資料行 __$start_lsn 和 __$operation 中套用資料列所需的作業。 此外,當更新作業傳回 (__$operation = 4) 更新中修改的擷取資料行會在 __$update_mask 傳回的值中標示。

全部合併
傳回中繼資料行 __$start_lsn中資料列之最終變更的 LSN。 資料行 __$operation 將是兩個值之一:1 用於刪除,5 表示套用變更所需的作業是插入或更新。 資料行 __$update_mask一律為 Null。

因為判斷指定變更的精確作業的邏輯會增加查詢複雜性,所以這個選項的設計目的是為了在足以指出套用變更資料所需的作業是插入或更新時改善查詢效能,但不需要明確區分這兩者。 此選項在直接提供合併作業的目標環境中最具吸引力。

傳回的資料表

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

在相同交易中認可的所有變更都會共用相同的認可 LSN。 例如,如果來源資料表上的更新作業修改兩個數據列中的兩個數據行,則變更資料表會包含四個數據列,每個資料列都有相同的 __$start_lsnvalue。
__$operation int 識別將變更資料列套用至目標資料來源所需的資料操作語言 (DML) 作業。

如果 row_filter_option 參數的值全部或全部為 mask,則此資料行中的值可以是下列其中一個值:

1 = 刪除

2 = 插入

4 = update

如果row_filter_option參數的值全都與合併,則此資料行中的值可以是下列其中一個值:

1 = 刪除

5 = 插入或更新
__$update_mask varbinary(128) 位遮罩,其位對應至針對擷取實例識別的每個擷取資料行。 當 __$operation = 1 或 2 時,這個值已將所有定義的位設定為 1。 當 __$operation = 3 或 4 時,只有對應至已變更之資料行的位會設定為 1。
<擷取的來源資料表資料行> 視情況而異 這個函數所傳回的其餘資料行都是建立擷取執行個體時,在來源資料表中識別成擷取資料行的資料行。 如果未在擷取的資料行清單中指定任何資料行,則會傳回來源資料表中的所有資料行。

權限

需要系統管理員固定伺服器角色的成員資格,或db_owner固定資料庫角色的成員資格。 對於所有其他使用者,需要來源資料表中所有擷取資料行的 SELECT 許可權,如果已定義擷取實例的管制角色,該資料庫角色的成員資格。 當呼叫端沒有檢視來源資料的許可權時,函式會傳回所有資料行具有 Null 值的資料列。

備註

修改資料列的唯一識別碼會導致 fn_cdc_get_net_changes 使用 DELETE 顯示初始 UPDATE 命令,然後改為 INSERT 命令。 此行為必須同時追蹤變更前後的索引鍵。

如果呼叫 或 cdc.fn_cdc_get_net_changes_<capture_instance>cdc.fn_cdc_get_all_changes_<capture_instance> 提供的 LSN 範圍不適合,則預期會發生錯誤 313。 lsn_value如果 參數超出最低 LSN 或最高 LSN 的時間,則執行這些函式將會傳回錯誤 313: Msg 313, Level 16, State 3, Line 1 An insufficient number of arguments were supplied for the procedure or function 。 開發人員應該處理此錯誤。 如需因應措施的範例 T-SQL,請參閱 GitHub 上的 ReplTalk。

範例

下列範例會使用 函 cdc.fn_cdc_get_net_changes_HR_Department 式,在特定時間間隔內報告對來源資料表 HumanResources.Department 所做的淨變更。

首先,函 GETDATE 式是用來標記時間間隔的開頭。 將數個 DML 語句套用至來源資料表之後,會再次呼叫 函 GETDATE 式來識別時間間隔的結尾。 然後,函式sys.fn_cdc_map_time_to_lsn 用來將時間間隔對應至 LSN 值所系結的異動資料擷取查詢範圍。 最後,會查詢函 cdc.fn_cdc_get_net_changes_HR_Department 式,以取得時間間隔來源資料表的淨變更。 請注意,插入後刪除的資料列不會出現在函式所傳回的結果集中。 這是因為第一次新增並在查詢視窗中刪除的資料列在來源資料表上不會產生間隔的淨變更。

注意

執行此範例之前,您必須先在 sys.sp_cdc_enable_table (Transact-SQL) 執行範例 B,才能在資料表 HumanResources.Department 上啟用 CDC。 在下列範例中,HR_Department是 CDC 擷取實例的名稱,如 中所 sys.sp_cdc_enable_table 指定。

USE AdventureWorks2022;  
GO  
DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);  
-- Obtain the beginning of the time interval.  
SET @begin_time = DATEADD(day, -1, GETDATE()) ;  
-- DML statements to produce changes in the HumanResources.Department table.  
INSERT INTO HumanResources.Department (Name, GroupName)  
VALUES (N'MyDept', N'MyNewGroup');  
  
UPDATE HumanResources.Department  
SET GroupName = N'Resource Control'  
WHERE GroupName = N'Inventory Management';  
  
DELETE FROM HumanResources.Department  
WHERE Name = N'MyDept';  
  
-- Obtain the end of the time interval.  
SET @end_time = GETDATE();  
-- Map the time interval to a change data capture query range.  
SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);  
SET @from_lsn = ISNULL(sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time), [sys].[fn_cdc_get_min_lsn]('HR_Department') );
SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);  
  
-- Return the net changes occurring within the query window.  
SELECT * FROM cdc.fn_cdc_get_net_changes_HR_Department(@from_lsn, @to_lsn, 'all');  

另請參閱