我是一名Java开发人员,我对SQL Server数据库管理员有一点了解。 :)
目标:
编写一个Java程序,按计划,可以根据Changed Data Capture (CDC)从 ALL SQL Server更改表(CT)中获取数据。< / p>
我创建了一个包含一些表的TEST模式,并在其中几个表上启用了CDC
现在,我可以查询各个CT表并获取数据:
当我想通过Java程序安排这些查询时,挑战就开始了。如查询中所示,我使用时间戳对列tran_begin_time来获取相关的start_lsn,存在一些挑战:
答案 0 :(得分:1)
正如您可能已经猜测的那样,使用时间会在某些时候导致细微的错误。我建议直接贩卖LSN。 LSN(日志序列号的缩写)是数据库跟踪和命令数据更改的一种方式。 LSN单调增加。这就是我的建议:
sys.fn_cdc_get_max_lsn()
(sys.fn_cdc_get_max_lsn(), 0)
以获取数据库中的最新LSN。将其存储在表中,其中bit列的值为0(即不完整)现在您的初始设置已完成。对于正在进行的处理,您将执行以下操作:
where [__$start_lsn] > @lower_lsn and [__$start_lsn] <= @upper_lsn
的新行。这将是您查询的上边界。<file sed 's/"//10'
如果你这样做,你就不会错过任何数据。