<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为 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 | 所有更新旧 }

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

可以是下列选项之一:

全部
返回指定 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 时,始终为数据类型图像文本ntext 的列分配 NULL 值。 除非更新期间列发生更改,否则为数据类型 varbinary(max)varchar(max)nvarchar(max)的列分配 NULL 值。 当 __$operation = 1 时,这些列会在删除时分配其值。 捕获实例中包含的计算列的值始终为 NULL。

如果提供的 LSN 范围在调用或调用cdc.fn_cdc_get_all_changes_<capture_instance>cdc.fn_cdc_get_net_changes_<capture_instance>时不适用,则预期会出现错误 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的所有当前可用更改,该更改是为数据库中的 Source 表 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  

另请参阅