如果我正确理解您的问题,您正在尝试定义一个消息路由结构,该结构与您已经选择的设计(使用企业服务总线)和一个消息实现一起使用,您可以使用它来将数据从遗留系统中流出仅将更改转发到您的较新系统。
困难在于您试图以这样一种方式应用更改,即它们本身不会从从您的遗留系统接收数据包的客户端生成 CDC 消息。事实上,您所关心的只是让您的较新系统使用数据而不将消息传播回您的总线,从而产生不必要的串扰,这可能会增加,使您的基础设施过载。
秘密在于MSSQL 的 CDC 功能如何在更改通过网络传播时协调更改。具体来说,请注意以下警告:
所有更改都以 LSN 或日志序列号的形式记录。SQL 通过日志序列号明确标识 DML 的每个操作。对任何表的任何提交修改都记录在数据库的事务日志中,并带有 SQL Server 提供的特定 LSN。__$operationcolumn 值为:1 = 删除,2 = 插入,3 = 更新(更新前的值),4 = 更新(更新后的值)。
cdc.fn_cdc_get_net_changes_dbo_Employee 为我们提供了在函数中提供的 LSN 之间的所有净更改记录。我们有 net_change 函数返回的三个记录;有一个删除、一个插入和两个更新,但在同一条记录上。在更新记录的情况下,它仅显示两次更新完成后的净变化值。
要获取所有更改,请执行 cdc.fn_cdc_get_all_changes_dbo_Employee;有传递“ALL”或“ALL UPDATE OLD”的选项。'ALL' 选项提供所有更改,但对于更新,它提供更新后的值。因此,我们找到两条更新记录。我们有一条记录显示 Jason 更新为 Nichole 时的第一次更新,还有一条记录显示 Nichole 更新为 EMMA。
虽然此文档有些简洁且难以理解,但似乎更改是按 LSN 顺序记录和协调的。该系统应丢弃竞争性更改,从而使您的一致性模型有效地工作。
另请注意:
CDC 默认禁用,必须在数据库级别启用,然后在表上启用。
选项 B 变得显而易见:在您的遗留系统上建立 CDC,然后使用您的服务总线将这些更改转换为未绑定到 CDC 的更新(例如,使用原始事务更新语句)。这应该允许您从系统设计中寻求的单向数据流。
有关协调更改的其他方法,请考虑这篇关于“最终一致性”的 Wikipedia 文章提出的概念。祝您的内部数据库消息传递系统好运。