質問

マージ レプリケーションで使用される MS SQL 2000 テーブル (テーブルはパブリッシャ上にあります) からすべての行を誤って削除してしまいました。次に、DTS 操作を使用してバックアップ データベースから行を取得し、テーブルに再設定することで、問題をさらに悪化させました。

これにより、次の問題が発生しました。削除操作ではクライアント上で行に削除のマークが付けられましたが、DTS 操作ではレプリケーション トリガーがバイパスされるため、インポートされた行はサブスクライバー上で挿入のマークが付けられません。実際には、サブスクライバはパブリッシャ上にあるデータを失います。

そこで、「心配する必要はありません」と思い、行を再度削除し、insert ステートメントを介してそれらを正しく追加すると、サブスクライバーに挿入用にマークが付けられます。

これが私の問題です:独自のインデックス「uc1msmerge_tombstone」で「オブジェクト「msmerge_tombstone」に「オブジェクト」のキー行を挿入できないため、dtsed行を削除できません。」エラー。私がやりたいのは、マージ レプリケーション トリガーをバイパスしてテーブルから行を何らかの方法で削除することです。これは可能でしょうか?サブスクライバーは 50 台以上の Windows Mobile デバイスであるため、レプリケーションを削除してやり直したくありません。

編集:Truncate Tableコマンドを試してみました。これにより、「レプリケーション用に公開されているため、テーブル xxxx を切り詰めることはできません」というエラーが表示されます。

役に立ちましたか?

解決 6

ヒントをありがとう...最終的に解決策を見つけました。

マージ削除トリガーをテーブルから削除しました
DTSされた行を削除しました
マージ削除トリガーを再作成しました
insert ステートメントを使用して行を正しく追加しました。

マージトリガーをいじるのが少し心配でしたが、すべて 表示されます 正しく動作していること。

他のヒント

テーブルを切り詰めてみましたか?

挿入した行に同じ ID を持たせる必要がある場合は、テーブルを切り詰めて ID フィールドを 0 にリセットする必要がある場合があります。そうでない場合は、切り詰めるだけで問題ありません。

また、一意のインデックスを一時的に削除し、完了したら追加し直すことも検討できます。

sp_mergedummyupdate を調べてください

2 番目のテーブルを作成することはオプションでしょうか?2 番目のテーブルを作成し、必要なデータを入力し、制約/インデックスを追加してから、最初のテーブルを削除して 2 番目のテーブルの名前を変更することができます。これにより、適切なキーを持つデータが得られます。そして、そのデータはすべて、レプリケーションのトリクルダウンが許可されている SQL ステートメントで構成されている必要があります。それはおそらくパフォーマンスの点で最高ではありません...そして間違いなくある程度のリスクを課すことになります。

私はこれを複製環境で直接試したことはありません...しかし、少なくとも試してみる価値はあるかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top