<cdc.fn_cdc_get_all_changes_capture_instance> (Transact-SQL)

适用范围:SQL Server

为在指定日志序列号 (LSN) 范围内应用到源表的每项更改返回一行。 如果源行在该间隔内有多项更改,则每项更改都会表示在返回的结果集中。 除了返回更改数据外,四个元数据列还提供了将更改应用到另一个数据源所需的信息。

行筛选选项控制元数据列的内容和结果集中返回的行。 指定 所有 行筛选器选项时,每个更改只有一行来标识更改。 指定 所有更新旧 选项时,更新操作将表示为两行:一行包含更新前捕获的列的值,另一行包含更新后捕获的列的值。

此枚举函数是在对源表启用变更数据捕获时创建的。 函数名称派生并使用格式 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>

用于控制元数据列的内容和结果集中返回的行的选项。

可以是下列选项之一:

  • 所有

    返回指定 LSN 范围内的所有更改。 对于由更新操作导致的更改,此选项只返回在应用更新之后包含新值的行。

  • 所有更新旧

    返回指定 LSN 范围内的所有更改。 对于由更新操作导致的更改,此选项将返回在更新之前包含列值的行和更新之后包含列值的行。

返回的表

列名称 数据类型 说明
__$start_lsn binary(10) 与更改关联的提交 LSN,用于保留更改的提交顺序。 在同一事务中提交的更改将共享同一个提交 LSN 值。
__$seqval binary(10) 用于对某事务内的行更改进行排序的序列值。
__$operation int 标识将更改数据行应用到目标数据源所需的数据操作语言 (DML) 操作。 可以是以下值之一:

1 = delete
2 = insert
3 = update (捕获的列值是更新操作前的列值)。 仅当指定了行筛选选项“all update old”时才应用此值。
4 = update (捕获的列值是更新操作后的列值)
__$update_mask varbinary(128) 位掩码,为捕获实例标识的每个已捕获列均对应于一个位。 当 __$operation12时,此值的所有定义位都设置为 1。 当 __$operation34时,只有与更改的列对应的位设置为 1
<captured source table columns> 多种多样 函数返回的其余列是在创建捕获实例时标识的已捕获列。 如果已捕获列的列表中未指定任何列,则将返回源表中的所有列。

权限

需要 sysadmin 固定服务器角色或db_owner固定数据库角色的成员身份。 对于所有其他用户,要求对源表中的所有已捕获列具有 SELECT 权限;如果已定义捕获实例的访问控制角色,则还要求具有该数据库角色的成员身份。 当调用方无权查看源数据时,该函数返回错误 229:

The SELECT permission was denied on the object 'fn_cdc_get_all_changes_...', database '<DatabaseName>', schema 'cdc'.

注解

图像文本ntext 的列始终在 1__$operation3__$operation 时分配 NULL 值。 varbinary(max)varchar(max)nvarchar(max) 的列在更新期间 __$operation3 时分配 NULL 值。 __$operation 1时,这些列会在删除时分配其值。 捕获实例中包含的计算列始终具有 NULL值。

如果在调用 cdc.fn_cdc_get_all_changes_<capture_instance>cdc.fn_cdc_get_net_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.

此错误应由开发人员处理。

示例

提供了多个 SQL Server Management Studio 模板,演示如何使用变更数据捕获查询函数。 这些模板在 Management Studio 的“视图”菜单上可用。 有关详细信息,请参阅 模板资源管理器

本示例显示Enumerate All Changes for Valid Range Template。 它使用函数 cdc.fn_cdc_get_all_changes_HR_Department 报告捕获实例 HR_Department的所有当前可用更改,该更改为 AdventureWorks2022 数据库中的源表 HumanResources.Department 定义。

-- Enumerate All Changes for Valid Range Template
USE AdventureWorks2022;
GO

DECLARE @from_lsn AS BINARY (10), @to_lsn AS 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