cdc.fn_cdc_get_all_changes_<捕获实例> (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(“拒绝了对对象 'fn_cdc_get_all_changes_...' (数据库 '<DatabaseName>',架构 'cdc' )的 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