ここ の別の投稿で説明されているように、最近、サブスクライバー データベースのカスタム レプリケーションをセットアップしました。基本的に、パブリッシャーが新しいレコードをサブスクライバーにプッシュすると、ストアド プロシージャはレプリケートされた時刻をテーブルの余分な列に挿入し、新しいレコードをログ テーブルに挿入します。
ログ テーブルをメインのパブリケーション データベースにレプリケートしようとすると、問題が発生します。これは私がしたことです:
- ログ テーブルが配置されているデータベースで、新しいトランザクション レプリケーションをセットアップし、スナップショットを作成するように設定します。
- パブリケーションが作成されたら、新しいプッシュ サブスクリプションを作成し、すぐに初期化するように設定します。
- サブスクリプションが作成されたら、同期ステータスを確認し、スナップショットが正常に適用されていることを確認しました。
ここで奇妙な点があります。SQL Server Management Studio を使用して手動でログ テーブルにレコードを追加すると、レコードは正常にレプリケートされます。カスタム レプリケーション ストアド プロシージャによってレコードが追加された場合は、追加されません。ステータスには常に「レプリケートされたトランザクションはありません」と表示されます。
パブリケーションがこのように動作する理由がわかりません。カスタム レプリケーション ストアド プロシージャによって挿入されたデータがどのように異なる方法で処理されているかはわかりません。
誰かが私が間違ったことを説明できますか?
更新:数か月前に、この問題に対する回答がようやく得られましたが、この質問を更新することができませんでした。Microsoft にサポート コールを記録する必要がありますが、有効な解決策が得られました。
回答:この問題を解決するには、サブスクリプションを追加するときに、次のようなスクリプトを実行する必要があります。
sp_addsubscription @publication = 'TEST', ..., @loopback_detection = 'false'
解決の鍵は、上記の最後のパラメーターです。デフォルトでは、生成されたサブスクリプション スクリプトにはこのパラメーターがありません。