cdc.fn_cdc_get_all_changes_<捕获实例> (Transact-SQL)
为在指定日志序列号 (LSN) 范围内应用到源表的每项更改返回一行。 如果源行在该间隔内有多项更改,则每项更改都会表示在返回的结果集中。 除了返回更改数据外,四个元数据列还提供了将更改应用到另一个数据源所需的信息。 行筛选选项可控制元数据列的内容以及结果集中返回的行。 当指定“all”行筛选选项时,针对每项更改将只有一行来标识该更改。 当指定“all update old”选项时,更新操作会表示为两行:一行包含更新之前已捕获列的值,另一行包含更新之后已捕获列的值。
此枚举函数是在对源表启用变更数据捕获时创建的。 此函数名称是派生的,采用 **cdc.fn_cdc_get_all_changes_**capture_instance 格式,其中 capture_instance 是在对源表启用变更数据捕获时为捕获实例指定的值。
适用范围:SQL Server(SQL Server 2008 到当前版本)。 |
语法
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 中的**“视图”**菜单中。 有关详细信息,请参阅模板资源管理器。
本示例显示Enumerate All Changes for Valid Range Template。 本示例使用 cdc.fn_cdc_get_all_changes_HR_Department 函数报告捕获实例 HR_Department 的所有当前可用更改,该实例是针对 AdventureWorks2012 数据库中的源表 HumanResources.Department 定义的。
-- ==================================================
-- Enumerate All Changes for Valid Range Template
-- ==================================================
USE AdventureWorks2012;
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
请参阅
参考
cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)
sys.fn_cdc_map_time_to_lsn (Transact-SQL)
sys.sp_cdc_get_ddl_history (Transact-SQL)
sys.sp_cdc_get_captured_columns (Transact-SQL)
sys.sp_cdc_help_change_data_capture (Transact-SQL)