私があなたの質問を正しく理解している場合、あなたは既に選択した設計 (エンタープライズ サービス バスを使用)で機能するメッセージ ルーティング構造と、レガシー システムからデータを流すために使用できるメッセージ実装を定義しようとしています。ポートの変更のみを新しいシステムに転送します。
問題は、レガシー システムからデータ バンドルを受信するクライアントから 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 関数によって 3 つのレコードが返されます。削除、挿入、および 2 つの更新がありましたが、同じレコードでした。更新されたレコードの場合、両方の更新が完了した後の正味の変更値のみが表示されます。
すべての変更を取得するには、cdc.fn_cdc_get_all_changes_dbo_Employee; を実行します。「ALL」または「ALL UPDATE OLD」を渡すオプションがあります。「ALL」オプションはすべての変更を提供しますが、更新の場合は更新後の値を提供します。したがって、更新用の 2 つのレコードが見つかります。Jason が Nichole に更新されたときの最初の更新を示す 1 つのレコードと、Nichole が EMMA に更新されたときの 1 つのレコードがあります。
このドキュメントはやや簡潔で理解しにくいものですが、変更はログに記録され、LSN の順序で調整されているようです。競合する変更はこのシステムによって破棄され、一貫性モデルが効果的に機能するようになります。
次の点にも注意してください。
CDC はデフォルトで無効になっているため、データベース レベルで有効にしてから、テーブルで有効にする必要があります。
次に、オプション B が明らかになります。レガシー システムに CDC を導入し、サービス バスを使用して、これらの変更を CDC にバインドされていない更新に変換します (たとえば、生のトランザクション更新ステートメントを使用します)。これにより、システムの設計から求められる一方向のデータ フローが可能になります。
変更を調整するその他の方法については、ウィキペディアの記事「結果整合性」で提起された概念を検討してください。内部データベース メッセージング システムの幸運を祈ります。