cdc.fn_cdc_get_all_changes_<capture_instance> (Transact-SQL)

針對在指定之記錄序號 (LSN) 範圍內套用至來源資料表的每個變更,各傳回一個資料列。如果來源資料列在間隔期間具有多個變更,就會在傳回的結果集中表示每個變更。除了傳回變更資料以外,四個中繼資料資料行會提供讓您將變更套用至其他資料來源所需的資訊。資料列篩選選項會管理結果集中傳回的中繼資料資料行以及資料列內容。當您指定了 'all' 資料列篩選選項時,每個變更都剛好具有一個資料列來識別變更。當您指定了 'all update old' 選項時,更新作業會表示成兩個資料列:其中一個資料列包含更新之前擷取資料行的值,而另一個資料列則包含更新之後擷取資料行的值。

當來源資料表啟用異動資料擷取時,就會建立此列舉函數。函數名稱衍生自並採用 **cdc.fn_cdc_get_all_changes_**capture_instance 格式,其中 capture_instance 是當來源資料表啟用異動資料擷取時,針對擷取執行個體所指定的值。

主題連結圖示Transact-SQL 語法慣例

語法

cdc.fn_cdc_get_all_changes_capture_instance ( from_lsn , to_lsn , '<row_filter_option>' )

<row_filter_option> ::=
{ all
 | all update old
}

引數

  • 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 update old }
    管理結果集中傳回之中繼資料資料行以及資料列內容的選項。

    可以是下列其中一個選項:

    • all
      傳回指定之 LSN 範圍內的所有變更。若為由於更新作業所造成的變更,這個選項就只會傳回包含套用更新之後之新值的資料列。

    • all update old
      傳回指定之 LSN 範圍內的所有變更。若為由於更新作業所造成的變更,這個選項就會同時傳回包含更新之前之資料行值的資料列以及包含更新之後之資料行值的資料列。

傳回的資料表

資料行名稱

資料類型

描述

__$start_lsn

binary(10)

與變更相關聯的認可 LSN,其中保留變更的認可順序。在相同交易中認可的變更都會共用相同的認可 LSN 值。

__$seqval

binary(10)

用於排序交易內資料列變更的序列值。

__$operation

int

識別將變更資料的資料列套用至目標資料來源所需的資料操作語言 (DML) 作業。可以是下列其中一項:

1 = 刪除

2 = 插入

3 = 更新 (擷取的是更新作業之前的資料行值)。只有在您指定了 'all update old' 資料列篩選選項時,這個值才適用。

4 = 更新 (擷取的是更新作業之後的資料行值)。

__$update_mask

varbinary(128)

位元遮罩,其中含有對應至針對擷取執行個體所識別之每個擷取資料行的位元。當 __$operation = 1 或 2 時,這個值會將所有定義的位元都設定為 1。當 __$operation = 3 或 4,只有對應至已變更資料行的位元才會設定為 1。

<擷取的來源資料表資料行>

變化

這個函數所傳回的其餘資料行都是建立擷取執行個體時所識別的擷取資料行。如果擷取的資料行清單中沒有指定任何資料行,就會傳回來源資料表中的所有資料行。

權限

需要系統管理員 (sysadmin) 固定伺服器角色或 db_owner 固定資料庫角色中的成員資格。若為所有其他使用者,則需要來源資料表中所有擷取資料行的 SELECT 權限,而且如果定義了擷取執行個體的控制角色,便需要該資料庫角色的成員資格。當呼叫端不具備檢視來源資料的權限時,此函數會傳回錯誤 229 (「結構描述 ‘cdc’,資料庫 '<DatabaseName>,物件 'fn_cdc_get_all_changes_...' 沒有 SELECT 權限」)。

備註

如果指定的 LSN 範圍不在擷取執行個體的變更追蹤時間表內,此函數會傳回錯誤 208 (「提供給程序或函數 cdc.fn_cdc_get_all_changes 的引數數量不足」)。

__$operation = 1 或 __$operation = 3 時,image、text 和 ntext 資料類型的資料行一律會指定 NULL 值。除非資料行在更新時變更,否則當 __$operation = 3 時,varbinary(max)、varchar(max) 或 nvarchar(max) 資料類型的資料行一律會指定 NULL 值。當 __$operation = 1 時,這些資料行會在刪除時指定其值。包含在擷取執行個體中的計算資料行,一律使用 NULL 值。

範例

有許多 SQL Server Management Studio 範本示範如何使用異動資料擷取查詢函數。這些範本可在 Management Studio 的 [檢視] 功能表中找到。如需詳細資訊,請參閱<使用 SQL Server Management Studio 範本>。

此範例示範 Enumerate All Changes for Valid Range Template。它使用 cdc.fn_cdc_get_all_changes_HR_Department 函數來回報 HR_Department 擷取執行個體 (針對 AdventureWorks 資料庫中的 HumanResources.Department 來源資料表而定義) 目前所有可用的變更。

-- ==================================================
-- Enumerate All Changes for Valid Range Template
-- ==================================================
USE AdventureWorks
GO

DECLARE @from_lsn binary(10), @to_lsn binary(10)
SET @from_lsn =
   sys.fn_cdc_get_min_lsn('HR_Department')
SET @to_lsn   = sys.fn_cdc_get_max_lsn()
SELECT * FROM cdc.fn_cdc_get_all_changes_HR_Department
  (@from_lsn, @to_lsn, N'all')
GO