Sql server 2008 r2 使用CDC防止多个数据库的更新循环

Sql server 2008 r2 使用CDC防止多个数据库的更新循环,sql-server-2008-r2,cdc,Sql Server 2008 R2,Cdc,我们有许多无法更改的遗留系统-但是,我们希望开始从这些系统获取数据更改,并将其自动应用到其他系统 我们考虑某种形式的服务总线(没有特定的技术被选中)位于中间,一组总线适配器(每个遗留应用程序之一)在数据库特定概念和一般更新消息之间进行转换。 我一直在研究的一个领域是使用变更数据捕获(CDC)来监控遗留数据库中的更新活动,并使用这些信息来构建适当的消息。然而,我有一个问题——作为CDC信息的消费者,我如何才能最好地区分应用程序应用的更改和总线适配器在收到消息时应用的更改——因为如果不是这样,当每个

我们有许多无法更改的遗留系统-但是,我们希望开始从这些系统获取数据更改,并将其自动应用到其他系统

我们考虑某种形式的服务总线(没有特定的技术被选中)位于中间,一组总线适配器(每个遗留应用程序之一)在数据库特定概念和一般更新消息之间进行转换。 我一直在研究的一个领域是使用变更数据捕获(CDC)来监控遗留数据库中的更新活动,并使用这些信息来构建适当的消息。然而,我有一个问题——作为CDC信息的消费者,我如何才能最好地区分应用程序应用的更改和总线适配器在收到消息时应用的更改——因为如果不是这样,当每个接收器将更改应用到自己的系统时,由总线分发的第一个更新将由每个接收器重新分发

如果我正在实现“穷人”CDC(即触发器),那么这些触发器将在原始DML语句的上下文/事务/连接中执行,因此我可以将它们设计为忽略某个特定用户(从总线应用传入更新的用户),或者设置并检测会话属性以忽略某些更新


有什么想法吗?

如果我正确理解了您的问题,那么您正在尝试定义一个消息路由结构,该结构与您已经选择的设计(使用)配合使用,并且您可以使用该结构将数据从仅将更改转发到较新系统的旧系统中流出

困难在于您试图以这样一种方式应用更改,即这些更改本身不会从从从遗留系统接收数据包的客户端生成CDC消息。事实上,您所关心的只是让较新的系统使用数据,而不是将消息传播回总线,从而产生可能成倍增加的不必要串扰,从而使基础设施过载

秘密在于它们通过网络传播。具体而言,请注意以下警告:

所有更改都以LSN或日志序列号的形式记录。SQL 通过日志序列号清楚地标识DML的每个操作。 任何表上提交的任何修改都记录在 具有SQL提供的特定LSN的数据库的事务日志 服务器。_u$operationcolumn值为:1=删除,2=插入,3= 更新(更新前的值),4=更新(更新后的值)

cdc.fn\u cdc\u get\u net\u changes\u dbo\u员工向我们提供所有记录net 在函数中提供的LSN之间更改。我们有 net_change函数返回的三条记录;删除了,, 一次插入,两次更新,但在同一条记录上。以防 更新的记录,它只显示两个 更新已完成

要获取所有更改,请执行 cdc.fn\u cdc\u获得所有变更\u dbo\u员工;有两种选择 通过“全部”或“全部更新旧”。“全部”选项提供了所有 更改,但对于更新,它提供更新后的值。因此 我们找到两条更新记录。我们有一张记录显示第一次 Jason被更新为Nichole时更新,Nichole被更新时更新一条记录 更新为EMMA

虽然本文档有点简洁且难以理解,但似乎更改是按LSN顺序记录和协调的。此系统应放弃相互竞争的更改,从而使一致性模型能够有效地工作

另请注意:

CDC在默认情况下是禁用的,必须在数据库级别启用 然后在表上启用

选项B变得显而易见:在遗留系统上建立CDC,然后使用服务总线将这些更改转换为不绑定到CDC的更新(例如,使用原始事务更新语句)。这应该考虑到您从系统设计中寻求的单向数据流

<>追加更改的其他方法,请考虑。祝您的内部数据库消息传递系统好运