1

ここ の別の投稿で説明されているように、最近、サブスクライバー データベースのカスタム レプリケーションをセットアップしました。基本的に、パブリッシャーが新しいレコードをサブスクライバーにプッシュすると、ストアド プロシージャはレプリケートされた時刻をテーブルの余分な列に挿入し、新しいレコードをログ テーブルに挿入します。

ログ テーブルをメインのパブリケーション データベースにレプリケートしようとすると、問題が発生します。これは私がしたことです:

  1. ログ テーブルが配置されているデータベースで、新しいトランザクション レプリケーションをセットアップし、スナップショットを作成するように設定します。
  2. パブリケーションが作成されたら、新しいプッシュ サブスクリプションを作成し、すぐに初期化するように設定します。
  3. サブスクリプションが作成されたら、同期ステータスを確認し、スナップショットが正常に適用されていることを確認しました。

ここで奇妙な点があります。SQL Server Management Studio を使用して手動でログ テーブルにレコードを追加すると、レコードは正常にレプリケートされます。カスタム レプリケーション ストアド プロシージャによってレコードが追加された場合は、追加されません。ステータスには常に「レプリケートされたトランザクションはありません」と表示されます。

パブリケーションがこのように動作する理由がわかりません。カスタム レプリケーション ストアド プロシージャによって挿入されたデータがどのように異なる方法で処理されているかはわかりません。

誰かが私が間違ったことを説明できますか?

更新:数か月前に、この問題に対する回答がようやく得られましたが、この質問を更新することができませんでした。Microsoft にサポート コールを記録する必要がありますが、有効な解決策が得られました。


回答:この問題を解決するには、サブスクリプションを追加するときに、次のようなスクリプトを実行する必要があります。

sp_addsubscription @publication = 'TEST', ..., @loopback_detection = 'false'

解決の鍵は、上記の最後のパラメーターです。デフォルトでは、生成されたサブスクリプション スクリプトにはこのパラメーターがありません。

4

2 に答える 2

1

数か月前にようやくこの問題に対する答えが得られましたが、この質問を更新することはできませんでした。Microsoftへのサポートコールをログに記録する必要がありますが、実用的な解決策が得られました。

この問題を解決するには、サブスクリプションを追加するときに、次のようなスクリプトを実行する必要があります。

sp_addsubscription @publication = 'TEST', ..., @loopback_detection = 'false'

解決策の鍵は、上記の最後のパラメーターです:@loopback_detection='false'。デフォルトでは、生成されたサブスクリプションスクリプトにはこのパラメーターがありません。

于 2009-03-16T10:03:44.053 に答える
0

これは非常に古い質問だと思いますので、おそらくこれは解決しましたが、とにかく...

あなたが説明する問題は確かに意味をなさないようです。レプリケーションは、レプリケーショントリガーを介してソーステーブルへの変更に対してさらに呼び出されます。プロセスの説明で正しく表示されないのは(誤解しているかもしれませんが)、サブスクリプションをプッシュする前にスナップショットを作成していることだけです。通常、レプリケーションを設定し、サブスクリプションをプッシュしてから、スナップショットを作成/プッシュする必要があります。これは何もチェックしていないため、同期ステータスを信頼しないでください。コピーするトランザクションがないことを示しているだけで、テーブルが同期されていることを認識していません。

手動挿入は機能するが自動挿入は機能しない理由については、基本的に、レプリケーションが機能している場合、ソースに関係なく、このテーブルへの変更がレプリケートされるため、動作を確認して再確認します。

あなたがこれを解決してから長い間、私は解決を聞くことに興味があります。

編集:

最近の考え:カスタムプロシージャを使用して日時フィールドを更新し、その後トリガーをレプリケーションデータベースに戻すと、レプリケーションモデルとインサートの間にデッドロックの問題が発生する可能性があります。これにより、複製の失敗が発生する可能性があります。テストを実行せずに理解するには少し複雑ですが、それは可能性です。

于 2009-02-09T12:34:24.533 に答える