<cdc.fn_cdc_get_all_changes_capture_instance> (Transact-SQL)

适用于:SQL Server

为在指定日志序列号 (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二进制 (10)

仅 cdc 中的行 。[capture_instance]_CT 结果集中包含值在 __$start_lsn 大于或等于 from_lsn 的更改表。

to_lsn

LSN 值,它表示要包含在结果集中的 LSN 范围的高端点。 to_lsn二进制 (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 The SELECT permission was denied on the object 'fn_cdc_get_all_changes_...', database '\<DatabaseName>', schema 'cdc'.

注解

__$operation = 1 或 __$operation = 3 时,始终为数据类型 imagetextntext 的列分配 NULL 值。 当 __$operation = 3 时,数据类型为 varbinary (max) varchar (max) nvarchar (max) 的列分配 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。 此错误应由开发人员处理。 有关解决方法的示例 T-SQL,请参阅 GitHub 上的 ReplTalk

示例

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

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

-- ========  
-- Enumerate All Changes for Valid Range Template  
-- ========  
USE AdventureWorks2022;  
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  

另请参阅