none
SQL Server 2019のマージパブリケーションを使用した競合の自動解決について RRS feed

  • 質問

  • SQL Server2019でマージパブリケーションを使用し、データの同時挿入時の競合の自動回避の方法を探しています。

    更新と削除は"競合の表示"で見たところは解決はしていますが、挿入のみがうまくいきません。

    できれば、先着優先かサーバー優先が好ましいです。

    サブスクリプションのオプション

     マージエージェント場所:ディストリビューター(プッシュサブスクリプション)

     サブスクリプションの種類:クライアント

    2020年7月8日 1:50

回答

  • aAyoshidAさん、こんにちは。フォーラムオペレーターのKumoです。
    ご返信いただきありがとうございます。

    マージアーティクルでプロパティcompensate_for_errorsをTRUEに設定してみてはいかがでしょう。
    以下のURLが参考になるかもしれません。
    Merge Replication Unique Key Constraint
    Primary key constraint causing row insert failure

    どうぞよろしくお願いいたします。 

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~


    2020年7月14日 8:53
    モデレータ

すべての返信

  • aAyoshidAさん、こんにちは。フォーラムオペレーターのKumoです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    マージレプリケーションに追加するテーブルのPRIMARY KEY列にIdentityプロパティがある場合、競合が発生する可能性があります。

    SQL ServerマージレプリケーションでIdentityレンジマネジメントを検討する必要があります。
    この記事をご参照ください。


    どうぞよろしくお願いいたします。 


    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年7月13日 9:17
    モデレータ
  • Kumo様

    ご回答していただきありがとうございます。

    確認をしてみましたがPRIMARY KEYにIdentityプロパティを設定はしておらず、それでも競合が発生します。
    また、Identityを設定していなかったため、リンク先の記事にあったプロパティ箇所も見つかりませんでした。


    最初の質問内容は、材料が少ないと思ったため追記:

    パブリッシャーとサブスクライバーが同じPRIMARY KEYでデータを挿入しようとすると、競合が発生し、PRIMARY KEY違反としてマージが行われません。これを自動回避する方法を探しています。


    お手数ではありますが、よろしくお願いいたします。
    2020年7月14日 0:27
  • aAyoshidAさん、こんにちは。フォーラムオペレーターのKumoです。
    ご返信いただきありがとうございます。

    マージアーティクルでプロパティcompensate_for_errorsをTRUEに設定してみてはいかがでしょう。
    以下のURLが参考になるかもしれません。
    Merge Replication Unique Key Constraint
    Primary key constraint causing row insert failure

    どうぞよろしくお願いいたします。 

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~


    2020年7月14日 8:53
    モデレータ
  • Kumo様

    ご回答していただきありがとうございます。

    compensate_for_errorsをTRUEに設定してみたところ、無事に競合が解決されたのを確認しました。

    しかし、"競合の表示"でサブスクリプション側の競合のログがあります。これを溜めないもしくは自動で削除させる方法はありますでしょうか?

    2020年7月20日 1:39
  • aAyoshidAさん、こんにちは。フォーラムオペレーターのKumoです。
    ご返信いただきありがとうございます。

    競合情報の格納は、conflict_loggingパブリケーションプロパティによって制御されています。
    sp_changemergepublicationを使用して、conflict_loggingプロパティの値をパブリッシャー、サブスクライバー、またはその両方として指定することができます。
    SQL Server 2019パブリケーションの場合、競合レコードはデフォルトでパブリッシャーとサブスクライバーの両方に格納されます。

    このストアドプロシージャで競合の保持期間を変更することもできます(デフォルトは14日間)。

    もっと詳しい情報は、sp_changemergepublication をご確認のほどお願いします。

    どうぞよろしくお願いいたします。 

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年7月20日 8:44
    モデレータ
  • Kumo様

    ご回答していただきありがとうございます。

    記載していただいた方法をどちらとも試してみたのですが、競合レコードが残ります。

    パブリケーション側とサブスクリプション側の両側で競合レコードを溜めない、もしくは競合レコードを自動で削除する方法はございますでしょうか?

    2020年7月22日 9:04
  • aAyoshidAさん、こんにちは。フォーラムオペレーターのKumoです。
    ご返信いただきありがとうございます。

    たぶん、方法はないと思いますね。

    マージ エージェントが同期するとき、特定の制約またはトリガーのため競合が発生した場合、
    1、デフォルトでは、競合の表示で競合はエラーなく報告されます。
    この段階では、データは同期されなく、競合が解決されるまでこの状態のままです。

    2、ほかに、@compensate_for_errorsをTrueに設定してもいいです。(デフォルトはfalse)
    マージエージェントは補正変更をソースパートナーに送信して、失敗した変更を取り消すことができます。
    つまり、パートナーで挿入が失敗したら、ソースレコードを削除します。
    これはすべて同じ同期セッションで発生し、エラーは発生しません。
    しかし、競合が発生した場合、競合が競合の表示で登録され、手動で削除する必要があります。


    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Kumo ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。~

    2020年7月23日 5:42
    モデレータ