次の方法で共有


マージ レプリケーションのプロパティを指定する

このトピックでは、マージ レプリケーションのさまざまなプロパティを指定する方法について説明します。

ダウンロードのみ

このセクションでは、SQL Server Management Studioまたは Transact-SQL を使用して、SQL Server 2014 でマージ テーブルアーティクルをダウンロード専用に指定する方法について説明します。 ダウンロード専用のアーティクルは、サブスクライバーで更新されないデータを含むアプリケーション用に設計されています。 詳細については、「ダウンロード専用アーティクルを使用したマージ レプリケーションのパフォーマンス最適化」を参照してください。

制限事項と制約事項

  • サブスクリプションが初期化された後でアーティクルをダウンロードのみに指定する場合は、そのアーティクルを受信したすべてのクライアント サブスクリプションを再初期化する必要があります。 サーバー サブスクリプションは再初期化する必要はありません。 プロパティ変更の影響の詳細については、「パブリケーションおよびアーティクルのプロパティの変更」を参照してください。

SQL Server Management Studio を使用する

パブリケーションの新規作成ウィザードの [アーティクル] ページまたは [アーティクルのプロパティ - <> アーティクル] ダイアログ ボックスの [プロパティ] タブで、アーティクルがダウンロード専用であることを指定します。 このダイアログ ボックスは、[パブリケーションの新規作成ウィザード] および [ パブリケーションのプロパティ - <パブリケーション> ] ダイアログ ボックスで使用できます。 ウィザードの使用およびダイアログ ボックスへのアクセスの詳細については、「パブリケーションの作成」および「View and Modify Publication Properties」 (パブリケーション プロパティの表示および変更) を参照してください。

[アーティクル] ページでアーティクルをダウンロードのみに指定するには

  • パブリケーションの新規作成ウィザードの [アーティクル] ページでテーブルを選択し、 [反転表示されたテーブルはダウンロードのみである] チェック ボックスをオンにします。

アーティクルが [アーティクルのプロパティ - <> アーティクル] ダイアログ ボックスの [プロパティ] タブでダウンロード専用であることを指定するには

  1. [パブリケーションの新規作成ウィザード] または [パブリケーションのプロパティ - <パブリケーション>] ダイアログ ボックスの [アーティクル] ページで、テーブルを選択し、[アーティクルのプロパティ] をクリックします。

  2. [反転表示されたテーブル アーティクルのプロパティを設定] または [すべてのテーブル アーティクルのプロパティを設定] をクリックします。

  3. [アーティクルのプロパティ - <アーティ>クル] ダイアログ ボックスの [プロパティ] タブの [変換先オブジェクト] セクションで、[同期の方向] に次のいずれかの値を指定します。

    • [サブスクライバーへのダウンロードのみを実行し、サブスクライバーの変更を禁止する]
    • [サブスクライバーへのダウンロードのみを実行し、サブスクライバーの変更を許可する]
  4. [ パブリケーションのプロパティ - <パブリケーション> ] ダイアログ ボックスにある場合は、[ OK] を クリックしてダイアログ ボックスを保存して閉じます。

Transact-SQL の使用

新しいマージ テーブル アーティクルをダウンロード専用に指定するには

  1. パラメーター @subscriber_upload_options1 または 2 を指定し、 sp_addmergearticleを実行します。 各数値は次の動作に対応します。

    • 0 - 制限なし (既定)。 サブスクライバー側で行われた変更は、パブリッシャーにアップロードされます。

    • 1 - サブスクライバーでの変更は許可されますが、パブリッシャーにはアップロードされません。

    • 2 - サブスクライバーでの変更は許可されません。

      注意

      アーティクルのソース テーブルが別のパブリケーションで既にパブリッシュされている場合、 @subscriber_upload_options の値は、両方のアーティクルで同じであることが必要です。

既存のマージ テーブル アーティクルをダウンロード専用に変更するには

  1. アーティクルがダウンロード専用であるかどうかを確認するには、 sp_helpmergearticleを実行します。 結果セットのアーティクルの upload_options の値を確認します。

  2. 手順 1. で返された値が 0である場合は、 @propertysubscriber_upload_options を、 @force_invalidate_snapshotおよび @force_reinit_subscription1 を、 @valueには次の動作に対応する 1 または 2 を指定して、 sp_changemergearticleを実行します。

    • 1 - サブスクライバーでの変更は許可されますが、パブリッシャーにはアップロードされません。

    • 2 - サブスクライバーでの変更は許可されません。

      注意

      アーティクルのソース テーブルが別のパブリケーションで既にパブリッシュされている場合、ダウンロード専用の動作は、両方のアーティクルで同じであることが必要です。

対話型の競合の解決

Microsoft SQL Server レプリケーションには、Microsoft Windows 同期マネージャーでの要求時同期中に、手動で競合を解決できるインタラクティブ競合回避モジュールがあります。 インタラクティブな競合解決を有効にすると、インタラクティブ競合回避モジュールを使用して、同期実行時に競合がインタラクティブに解決されます。 インタラクティブ競合回避モジュールは、Microsoft Windows 同期マネージャーを介して利用できます。 詳細については、「 Windows 同期マネージャー (Windows 同期マネージャー) を使用してサブスクリプションを同期する」を参照してください。

推奨事項

  • 同期が Windows 同期マネージャーの外部で (スケジュールされた同期、または SQL Server Management Studio かレプリケーション モニターでの要求時同期として) 実行される場合、アーティクルに指定された既定の競合回避を使用して、ユーザーの介入なしに自動的に競合が解決されます。 詳細については、「 Interactive Conflict Resolution」を参照してください。

SQL Server Management Studio を使用する

アーティクルに対するインタラクティブな競合解決の有効化

  1. [パブリケーションの新規作成ウィザード] または [パブリケーションのプロパティ - <パブリケーション>] ダイアログ ボックスの [アーティクル] ページで、テーブルを選択します。 ウィザードの使用およびダイアログ ボックスへのアクセスの詳細については、「パブリケーションの作成」および「View and Modify Publication Properties」 (パブリケーション プロパティの表示および変更) を参照してください。
  2. [アーティクルのプロパティ] をクリックし、次に [反転表示されたテーブル アーティクルのプロパティを設定] または [すべてのテーブル アーティクルのプロパティを設定] をクリックします。
  3. [アーティクルのプロパティ - <アーティクルまたはアーティ>クルのプロパティ - <ArticleType>] ページで、[競合回避モジュール] タブをクリックします。
  4. [要求時同期中にサブスクライバーが対話的に競合を解決することを許可する] を選択します。
  5. [OK] をクリックします。
  6. [ パブリケーションのプロパティ - <パブリケーション> ] ダイアログ ボックスにある場合は、[ OK] を クリックしてダイアログ ボックスを保存して閉じます。

サブスクリプションでインタラクティブな競合解決を使用するように指定するには

  1. [サブスクリプションのプロパティ - <サブスクライバー>: <SubscriptionDatabase>] ダイアログ ボックスで、[競合を対話的に解決する] オプションに True の値を指定します。 このダイアログ ボックスへのアクセスの詳細については、「 View and Modify Push Subscription Properties 」および「 View and Modify Pull Subscription Properties」を参照してください。
  2. [OK] をクリックします。

Transact-SQL の使用

マージ パブリケーションに対するプル サブスクリプションが作成されるときに、サブスクライバーがこのグラフィカル インターフェイスを使用してアーティクルの競合を回避するように、プログラムで指定できます。 このオプションをサポートするアーティクル内の競合のみが、インタラクティブ競合回避モジュールに表示されます。

インタラクティブ競合回避モジュールを使用するマージ プル サブスクリプションの作成

  1. パブリッシャー側のパブリケーション データベースに対し、 @publicationを指定して sp_helpmergearticleを実行します。 インタラクティブ競合回避モジュールが使用される結果セット内の各アーティクルに対する allow_interactive_resolver の値を確認します。

    • この値が 1の場合、インタラクティブ競合回避モジュールが使用されます。
    • この値が 0の場合は、最初に、各アーティクルに対してインタラクティブ競合回避モジュールを有効にする必要があります。 そのためには、 @publication@articleを指定し、 @propertyallow_interactive_resolver を、 @valuetrue を指定して、 sp_changemergearticleを実行します。
  2. サブスクライバー側のサブスクリプション データベースに対して、 sp_addmergepullsubscriptionを実行します。 詳細については、「 プル サブスクリプションの作成」をご覧ください。

  3. サブスクライバー側のサブスクリプション データベースに対し、次のパラメーターを指定して sp_addmergepullsubscription_agentを実行します。

    • @publisher@publisher_db (パブリッシュされるデータベース)、および @publication
    • @enabled_for_syncmgrtrue
    • @use_interactive_resolvertrue
    • マージ エージェントが必要とするセキュリティ アカウント情報。 詳細については、「 プル サブスクリプションの作成」をご覧ください。
  4. パブリッシャー側のパブリケーション データベースに対し、 sp_addmergesubscriptionを実行します。

インタラクティブ競合回避モジュールをサポートするアーティクルの定義

パブリッシャー側のパブリケーション データベースに対して、 sp_addmergearticleを実行します。 @publicationにアーティクルが属するパブリケーションの名前を、 @articleにアーティクルの名前を、 @source_objectにパブリッシュされるデータベース オブジェクトを指定し、 @allow_interactive_resolvertrueを指定します。 詳しくは、「 アーティクルを定義」をご覧ください。

競合の追跡と解決レベルを指定する

マージ パブリケーションへのサブスクリプションを同期する際、パブリッシャーとサブスクライバーの同じデータに加えられた変更によって、競合が発生していないかどうかがレプリケーション時に確認されます。 競合を行レベルで検出するか (行に加えられたすべての変更が競合と見なされます)、列レベルで検出するか (同じ行と列に対する変更のみが競合と見なされます) を指定できます。 アーティクルの競合解決は行レベルで実行されます。 論理レコードが使用される場合の競合の検出と解決の詳細については、「 Detecting and Resolving Conflicts in Logical Records」を参照してください。

制限事項と制約事項

  • サブスクリプションを初期化した後で追跡レベルを変更した場合は、サブスクリプションを再初期化する必要があります。 プロパティ変更の影響の詳細については、「パブリケーションおよびアーティクルのプロパティの変更」を参照してください。
  • 行レベルおよび列レベルの追跡では、行レベルでの競合回避は常に実行されます。優先されなかった行が優先された行で上書きされます。 マージ レプリケーションでは、論理レコード レベルでの競合の追跡と回避も指定できますが、このオプションは SQL Server Management Studioにはありません。 レプリケーション ストアド プロシージャからこのオプションを設定する方法については、「 マージ テーブル アーティクル間に論理レコード リレーションシップを定義する」を参照してください。

SQL Server Management Studio を使用する

[アーティクルのプロパティ] ダイアログ ボックスの [プロパティ] タブで、マージ アーティクルの行レベルまたは列レベルの追跡を指定します。このタブは、[パブリケーションの新規作成ウィザード] および [パブリケーションのプロパティ - <パブリケーション>] ダイアログ ボックスで使用できます。 ウィザードの使用およびダイアログ ボックスへのアクセスの詳細については、「パブリケーションの作成」および「View and Modify Publication Properties」 (パブリケーション プロパティの表示および変更) を参照してください。

行レベルまたは列レベルの追跡の指定

  1. パブリケーションの新規作成ウィザードまたは [パブリケーションのプロパティ - <パブリケーション>] ダイアログ ボックスの [アーティクル] ページで、テーブルを選択します。
  2. [アーティクルのプロパティ] をクリックし、次に [反転表示されたテーブル アーティクルのプロパティを設定] または [すべてのテーブル アーティクルのプロパティを設定] をクリックします。
  3. [アーティクルのプロパティ<アーティクル>] ダイアログ ボックスの [プロパティ] タブで、[追跡レベル] プロパティに [行レベルの追跡] または [列レベルの追跡] のいずれかの値を選択します。
  4. [ パブリケーションのプロパティ - <パブリケーション> ] ダイアログ ボックスに表示されている場合は、[ OK] を クリックしてダイアログ ボックスを保存して閉じます。

Transact-SQL の使用

新しいマージ アーティクルの競合追跡オプションを指定する

  1. パブリッシャーのパブリケーション データベースに対して、 sp_addmergearticle を実行し、次のいずれかの値を @column_trackingに指定します。

    • true - アーティクルに対して列レベルの追跡を使用します。
    • false - 既定の行レベルの追跡を使用します。

マージ アーティクルの競合追跡オプションの変更

  1. マージ アーティクルの競合追跡オプションを定義するには、 sp_helpmergearticleを実行します。 アーティクルの結果セットの column_tracking オプションの値を調べます。 値 1 は、列レベルの追跡が使用されていることを示します。値 0 は、行レベルの追跡が使用されていることを示します。

  2. パブリッシャー側のパブリケーション データベースに対して、 sp_changemergearticleを実行します。 @propertycolumn_tracking の値を指定し、 @valueに次のいずれかの値を指定します。

    • true - アーティクルに対して列レベルの追跡を使用します。
    • false - 既定の行レベルの追跡を使用します。

    @force_invalidate_snapshot および @force_reinit_subscription1を指定します。

削除の追跡

注意

この機能は、Microsoft SQL Server の将来のバージョンで削除されます。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。

既定では、マージ レプリケーションではパブリッシャーとサブスクライバーの DELETE コマンドが同期されます。 マージ レプリケーションを使用すると、行がパブリケーションから削除されても、サブスクリプション データベースでその行を保持できます。その逆の操作も可能です。 新しいアーティクルを作成するときに DELETE コマンドを無視するようにプログラムで指定したり、レプリケーション ストアド プロシージャを使用してこの機能を後で有効にすることができます。

重要

この機能を有効にすると、データが収束しなくなります。つまり、サブスクライバーに存在するデータにパブリッシャーのデータが正確に反映されなくなります。 削除された行を手動で削除するためのメカニズムを独自に実装する必要があります。

新しいマージ アーティクルで削除を無視する指定

  1. パブリッシャー側のパブリケーション データベースで、 sp_addmergearticle (Transact-SQL) を実行します。 @delete_trackingfalse値を に指定します。 詳しくは、「 アーティクルを定義」をご覧ください。

    注意

    アーティクルのソース テーブルが別のパブリケーションで既にパブリッシュされている場合、両方のアーティクルで delete_tracking の値を同じにする必要があります。

既存のマージ アーティクルで削除を無視する指定

  1. アーティクルに対してエラー補正が有効になっているかどうかを判断するには、 sp_helpmergearticle (Transact-SQL) を 実行し、結果セット内の delete_tracking の値をメモします。 値が 0の場合、削除は既に無視されています。

  2. 手順 1 の値が 1 の場合は、パブリケーション データベースのパブリッシャーで sp_changemergearticle (Transact-SQL) を実行します。 @propertyには delete_tracking@valueには のfalse値を指定します。

    注意

    アーティクルのソース テーブルが別のパブリケーションで既にパブリッシュされている場合、両方のアーティクルで delete_tracking の値を同じにする必要があります。

処理順序

マージ レプリケーションでは、同期処理中にアーティクルをマージ エージェントで処理する順序を指定できます。 この順序は、レプリケーションのストアド プロシージャを使用して、アーティクル作成時に各アーティクルに対してプログラムから割り当てることができます。 アーティクルは、最も小さい値から最も大きい値の順序で処理されます。 2 つのアーティクルの値が同じ場合、それらは同時に処理されます。 詳細については、「Specify Merge Replication properties」 (マージ レプリケーションのプロパティの指定) を参照してください。

Microsoft SQL Server 2005 以降では、マージ パブリケーションのアーティクル処理の既定の順序をオーバーライドできます。 これは、たとえば、トリガーを使用して参照整合性を定義し、これらのトリガーを特定の順序で起動する必要がある場合に便利です。

処理順序を決定する方法

マージ同期の際、既定ではアーティクルがオブジェクト間の依存関係で必要な順序で処理されます。依存関係には、ベース テーブルに対して定義されている宣言参照整合性 (DRI) 制約も含まれます。 同期処理では、テーブルに対する変更が列挙された後で、これらの変更が適用されます。 DRI が定義されておらず、テーブル アーティクル間に結合フィルターか論理レコードが存在する場合、フィルターや論理レコードで必要な順序でアーティクルが処理されます。 DRI、結合フィルター、論理レコード、またはその他の依存関係を介して他のアーティクルに関連しないアーティクルは、 シスマーギアティックス (Transact-SQL) システム テーブルの記事ニックネームに従って処理されます。

パブリケーションに SalesOrderHeader テーブルと SalesOrderDetail テーブルが含まれており、 SalesOrderHeader テーブルには主キー列 SalesOrderID があり、 SalesOrderDetail テーブルには対応する外部キー列 SalesOrderID があるとします。 同期の際、マージ レプリケーションでは、新しい行を SalesOrderHeader に挿入してから関連する行を SalesOrderDetailに挿入することで、外部キーの違反を防ぎます。 同様に、 SalesOrderDetail から行を削除した後で、関連する行を SalesOrderHeaderから削除します。

ただし、アプリケーションによっては、DRI ではなくデータベース トリガーやアプリケーション レベルで参照整合性が設定されます。 上記のようなパブリケーションでは、DRI ではなく SalesOrderDetail テーブルの挿入トリガーによって、挿入を許可する前に、 SalesOrderHeader テーブルに関連する行があることを確認できる場合があります。 SalesOrderHeader の削除トリガーでは、削除を許可する前に、 SalesOrderDetail に関連する行がないことを確認できる場合があります。 マージ レプリケーションでは、アーティクルの処理順序を決定する際にトリガーは考慮されません。トリガーが起動されないとその結果がどのようになるかがわからないためです。 同様に、アプリケーション レベルで定義された制約も考慮されません。

トリガーやアプリケーション レベルで参照整合性を保つ場合は、アーティクルの処理順序を指定する必要があります。 トリガーの例では、アーティクルの順序が挿入の順序で決まるため、 SalesOrderHeader テーブルを SalesOrderDetailの前に処理するように指定します。 マージ レプリケーションでは、削除の場合、自動的に順序が逆になります。 アーティクルの順序がなくてもマージ レプリケーションは失敗しません。これは、制約違反が発生してもマージ エージェントで処理が継続され、他のアーティクルの処理を終えた後で操作が再試行されるためです。 アーティクルの順序を指定すると、再試行とそれに付随する追加の処理が不要になります。 誤った順序 (詳細レコードがヘッダー レコードの前に処理されるような順序など) を指定すると、マージ レプリケーションは成功するまで処理を再試行します。

新しい記事

  1. パブリッシャー側のパブリケーション データベースで、 sp_addmergearticle (Transact-SQL) を実行します。 アーティクルの処理順序を表す整数値を @processing_orderに指定します。 詳しくは、「 アーティクルを定義」をご覧ください。

    注意

    処理順序を指定してアーティクルを作成する場合は、アーティクルの順序を表す値の間に、ある程度の間隔を設けるようにしてください。 こうすることで、後で、新しい値を設定するときに作業が楽になります。 たとえば、処理順序を指定するアーティクルが 3 つある場合、 @processing_order の値を 1、2、3 とせずに、それぞれ、10、20、30 のように指定します。

既存のアーティクル

  1. アーティクルの処理順序を決定するには、 sp_helpmergearticle (Transact-SQL) を 実行し、結果セット内の processing_order の値をメモします。

  2. パブリッシャー側のパブリケーション データベースで、 sp_changemergearticle (Transact-SQL) を実行します。 @propertyprocessing_order を、 @valueに処理順序を表す整数値を指定します。

参照

条件付き削除の追跡によるマージ レプリケーション パフォーマンスの最適化
Detecting and Resolving Conflicts in Logical Records
マージ テーブル アーティクル間に論理レコード リレーションシップを定義する
マージ レプリケーションの競合の検出と解決
ダウンロード専用アーティクルを使用したマージ レプリケーションのパフォーマンス最適化
アーティクルの定義
アーティクルのプロパティの表示と変更