使用哪一列对从 SQL Server 中的更改表读取的更改数据进行排序?

问题描述 投票:0回答:1

我是否应该依赖 seqval 对从 SQL Server 中的更改表捕获的更改数据进行排序,文档在两个地方提供了矛盾的语句。如果没有的话还有什么办法吗?

如果我们检查 cdc.fn_cdc_get_all_changes_,它会显示 __$seqval

用于对事务中的行更改进行排序的序列值。

cdc._CT 中,提到了 __$seqval:

事务日志中所示的操作顺序。不应该用于订购。相反,请使用 __$command_id 列。

我相信这两个 __$seqval 与从

fn_cdc_get_all_changes
表读取的
cdc.<capture_instance>_CT
函数相同。如果它是从
__$command_id
函数返回的,我会使用
fn_cdc_get_all_changes
,因为直接从系统表读取是不建议

sql-server replication change-data-capture
1个回答
0
投票

我和你有同样的要求。

这是我的发现:

  1. cdc.fn_cdc_get_all_changes_有时会返回相同的

    __$start_lsn
    __$seqval
    。在这种情况下,不可能根据此函数返回的数据重建交易的确切顺序(不幸的是,此函数未返回
    __$command_id
    )。

  2. 直接使用系统表cdc._CT,可以通过对

    __$seqval
    __$command_id
    进行排序来获得正确的交易顺序。但是,根据 Microsoft 文档,不建议使用这些表。

  3. 我的解决方案是使用 cdc.fn_cdc_get_net_changes_ 函数。此函数返回行的正确“合并和最终”状态,这(在我的情况下)足够好。

© www.soinside.com 2019 - 2024. All rights reserved.