このトピックでは、マージ レプリケーションのさまざまなプロパティを指定する方法について説明します。
ダウンロードのみ
このセクションでは、SQL Server Management Studio または Transact-SQL を使用して、SQL Server 2014 でマージ テーブルアーティクルがダウンロード専用であることを指定する方法について説明します。 ダウンロードのみの記事は、サブスクライバーで更新されないデータを含むアプリケーション向けに設計されています。 詳細については、「ダウンロード専用アーティクルを使用したマージ レプリケーションのパフォーマンス最適化」を参照してください。
制限事項と制約条件
- サブスクリプションの初期化後にアーティクルがダウンロード専用であることを指定した場合は、アーティクルを受信したすべてのクライアント サブスクリプションを再初期化する必要があります。 サーバー サブスクリプションを再初期化する必要はありません。 プロパティの変更の効果の詳細については、「 パブリケーションの変更」および「アーティクルのプロパティ」を参照してください。
SQL Server Management Studio の使用
パブリケーションの新規作成ウィザードの [アーティクル] ページまたは [アーティクルのプロパティ - <Article>] ダイアログ ボックスの [プロパティ] タブで、アーティクルをダウンロード専用に指定します。 このダイアログ ボックスは、パブリケーションの新規作成ウィザードと [ パブリケーションのプロパティ - <発行> ] ダイアログ ボックスで使用できます。 ウィザードの使用とダイアログ ボックスへのアクセスの詳細については、「 パブリケーションの作成 」および「パブリケーションの プロパティの表示と変更」を参照してください。
アーティクルが [アーティクル] ページでダウンロード専用であることを指定するには
- パブリケーションの新規作成ウィザードの [ アーティクル ] ページでテーブルを選択し、[ 強調表示されたテーブルがダウンロードのみ] チェック ボックスをオンにします。
アーティクルが [アーティクルのプロパティ - <Article> ] ダイアログ ボックスの [プロパティ] タブでダウンロード専用であることを指定するには
[パブリケーションの新規作成ウィザード] または [>] ダイアログ ボックスの [記事] ページで、テーブルを選択し、[記事のプロパティ] をクリックします。
[ 強調表示されたテーブル アーティクルのプロパティの設定 ] または [すべてのテーブル アーティクルのプロパティの設定] をクリックします。
[アーティクルのプロパティ - <Article>] ダイアログ ボックスの [プロパティ] タブの [コピー先オブジェクト] セクションで、[同期の方向] に次のいずれかの値を指定します。
- サブスクライバーにダウンロードし、サブスクライバーの変更を禁止する
- サブスクライバーにダウンロードし、サブスクライバーの変更を許可する
[ パブリケーションのプロパティ - <発行> ] ダイアログ ボックスを開いている場合は、[ OK] をクリックしてダイアログ ボックスを保存して閉じます。
Transact-SQL の使用
新しいマージ テーブルアーティクルがダウンロード専用であることを指定するには
パラメーター @subscriber_upload_optionsに1 または 2 の値を指定して、sp_addmergearticleを実行します。 数値は、次の動作に対応します。
0 - 制限なし (既定値)。 サブスクライバーで行われた変更はパブリッシャーにアップロードされます。
1 - 変更はサブスクライバーで許可されますが、パブリッシャーにはアップロードされません。
2 - サブスクライバーで変更を行うことができません。
注
アーティクルのソース テーブルが既に別のパブリケーションに発行されている場合、 @subscriber_upload_options の値は両方のアーティクルで同じである必要があります。
既存のマージ テーブル アーティクルをダウンロード専用に変更するには
アーティクルがダウンロード専用かどうかを判断するには、sp_helpmergearticle実行 します。 記事の結果セット内のupload_optionsの値に注意。
手順 1 で返される値が 0 の場合は、sp_changemergearticleを実行し、@propertyの値としてsubscriber_upload_options、@force_invalidate_snapshotと@force_reinit_subscriptionの値を 1 に、@valueの値を 1 または 2 に指定します。これは、次の動作に対応します。
1 - 変更はサブスクライバーで許可されますが、パブリッシャーにはアップロードされません。
2 - サブスクライバーで変更を行うことができません。
注
アーティクルのソース テーブルが既に別のパブリケーションに発行されている場合、ダウンロードのみの動作は両方のアーティクルで同じである必要があります。
対話型対立の解決
Microsoft SQL Server レプリケーションには対話型リゾルバーが用意されています。これにより、Microsoft Windows 同期マネージャーでのオンデマンド同期中に競合を手動で解決できます。 対話型解決を有効にした後、対話型リゾルバーを使用して、同期中に対話形式で競合を解決します。 対話型リゾルバーは、Microsoft Windows 同期マネージャーから入手できます。 詳細については、「 Windows 同期マネージャー (Windows 同期マネージャー) を使用してサブスクリプションを同期する」を参照してください。
推奨事項
- Windows 同期マネージャーの外部 (SQL Server Management Studio またはレプリケーション モニターでのスケジュールされた同期またはオンデマンド同期) の外部で同期が実行された場合、競合は、記事に指定されている既定の競合解決を使用して、ユーザーの介入なしに自動的に解決されます。 詳細については、「 対話型競合の解決」を参照してください。
SQL Server Management Studio の使用
記事の対話型競合解決を有効にする
- パブリケーションの新規作成ウィザードの [ アーティクル ] ページまたは [ パブリケーションのプロパティ - <発行> ] ダイアログ ボックスで、テーブルを選択します。 ウィザードの使用とダイアログ ボックスへのアクセスの詳細については、「 パブリケーションの作成 」および「パブリケーションの プロパティの表示と変更」を参照してください。
- [ アーティクルのプロパティ] をクリックし、[ 強調表示されたテーブル アーティクルのプロパティの設定 ] または [すべてのテーブル アーティクルのプロパティの設定] をクリックします。
- アーティクルのプロパティ - <Article> または アーティクルのプロパティ - <ArticleType> ページで、リゾルバー タブをクリックします。
- [サブスクライバーがオンデマンド同期中に競合を対話形式で解決できるようにする] を選択します。
- OK をクリックします。
- [ パブリケーションのプロパティ - <発行> ] ダイアログ ボックスを開いている場合は、[ OK] をクリックしてダイアログ ボックスを保存して閉じます。
サブスクリプションで対話型の競合解決を使用するように指定するには
- [サブスクリプションのプロパティ - <サブスクライバー>: <SubscriptionDatabase>] ダイアログ ボックスで、[競合を対話的に解決] オプションに True の値を指定します。 このダイアログ ボックスへのアクセスの詳細については、「 プッシュ サブスクリプションのプロパティの表示と変更」および「プル サブスクリプションのプロパティ の 表示と変更」を参照してください。
- OK をクリックします。
Transact-SQL の使用
マージ パブリケーションへのプル サブスクリプションが作成されたときに、サブスクライバーがこのグラフィカル インターフェイスを使用してアーティクルの競合を解決するようにプログラムで指定できます。 このオプションをサポートする記事の競合のみが対話型リゾルバーに表示されます。
対話型リゾルバーを使用するマージ プル サブスクリプションを作成する
パブリッシャー側のパブリケーション データベースで、@publicationを指定してsp_helpmergearticleを実行します。 対話型リゾルバーが使用される結果セット内の各アーティクルの allow_interactive_resolver の値に注意してください。
- この値が 1 の場合、対話型リゾルバーが使用されます。
- この値が 0 の場合は、最初に各アーティクルの対話型リゾルバーを有効にする必要があります。 これを行うには、sp_changemergearticleを実行し、@publication、@articleを指定し、@propertyにはallow_interactive_resolverの値を、@valueにはtrueの値を指定します。
サブスクリプション データベースのサブスクライバーで、 sp_addmergepullsubscriptionを実行します。 詳細については、「 プル サブスクリプションの作成」を参照してください。
サブスクリプション データベースのサブスクライバーで、次のパラメーター を指定して、sp_addmergepullsubscription_agentを実行します。
- @publisher、 @publisher_db (パブリッシュされたデータベース)、 および@publication。
- @enabled_for_syncmgr の値は true です。
- @use_interactive_resolverにはtrueを設定する場合。
- マージ エージェントに必要なセキュリティ アカウント情報。 詳細については、「 プル サブスクリプションの作成」を参照してください。
パブリッシャー側のパブリケーション データベースで、 sp_addmergesubscriptionを実行します。
対話型リゾルバーをサポートする記事を定義する
パブリッシャー側のパブリケーション データベースで、 sp_addmergearticleを実行します。 アーティクルが@publicationに属するパブリケーションの名前、@articleのアーティクルの名前、@source_objectにパブリッシュするデータベース オブジェクト、および@allow_interactive_resolverの場合は true の値を指定します。 詳細については、 アーティクルの定義を参照してください。
競合の追跡と解決レベルを指定する
マージ パブリケーションのサブスクリプションが同期されると、パブリッシャーとサブスクライバーの両方で同じデータが変更された場合に発生する競合がレプリケーションによってチェックされます。 競合を行レベルで検出するかどうかを指定できます。行に対する変更が競合と見なされるか、同じ行と列に対する変更のみが競合と見なされる列レベルかを指定できます。 アーティクルの競合解決は、行レベルで実行されます。 論理レコードを使用する場合の競合の検出と解決の詳細については、「 論理レコードの競合の検出と解決」を参照してください。
制限事項と制約条件
- サブスクリプションの初期化後に追跡レベルを変更する場合は、それらのサブスクリプションを再初期化する必要があります。 プロパティの変更の効果の詳細については、「 パブリケーションの変更」および「アーティクルのプロパティ」を参照してください。
- 行レベルと列レベルの追跡においては、競合が発生すると、常に行単位で解決されます。勝った行が負けた行を上書きします。 マージ レプリケーションでは、論理レコード レベルで競合を追跡および解決するように指定することもできますが、これらのオプションは SQL Server Management Studio からは使用できません。 レプリケーション ストアド プロシージャからこれらのオプションを設定する方法については、「 マージ テーブル アーティクル間の論理レコードリレーションシップの定義」を参照してください。
SQL Server Management Studio の使用
マージ アーティクルの行レベルまたは列レベルの追跡は、[アーティクルのプロパティ] ダイアログ ボックスの [プロパティ] タブで指定します。このタブは、[パブリケーションの新規作成ウィザード] および [パブリケーションのプロパティ - <発行>] ダイアログ ボックスで使用できます。 ウィザードの使用とダイアログ ボックスへのアクセスの詳細については、「 パブリケーションの作成 」および「パブリケーションの プロパティの表示と変更」を参照してください。
行レベルまたは列レベルの追跡を指定する
- パブリケーションの新規作成ウィザードの [ アーティクル ] ページまたは [ パブリケーションのプロパティ - <発行> ] ダイアログ ボックスで、テーブルを選択します。
- [ アーティクルのプロパティ] をクリックし、[ 強調表示されたテーブル アーティクルのプロパティの設定 ] または [すべてのテーブル アーティクルのプロパティの設定] をクリックします。
- [アーティクルのプロパティ] < [Article>] ダイアログ ボックスの [プロパティ] タブで、[追跡レベル] プロパティの [行レベルの追跡] または [列レベルの追跡] のいずれかの値を選択します。
- [ パブリケーションのプロパティ - <発行> ] ダイアログ ボックスを開いている場合は、[ OK] をクリックしてダイアログ ボックスを保存して閉じます。
Transact-SQL の使用
新しいマージ アーティクルの競合追跡オプションを指定する
パブリッシャー側のパブリケーション データベースで、 sp_addmergearticle を実行し、 @column_trackingに次のいずれかの値を指定します。
- true - アーティクルの列レベルの追跡を使用します。
- false - 既定の行レベルの追跡を使用します。
マージ アーティクルの競合追跡オプションを変更する
マージ アーティクルの競合追跡オプションを確認するには、 sp_helpmergearticleを実行します。 アーティクルの結果セットの column_tracking オプションの値に注意してください。 値 1 は列レベルの追跡が使用されていることを意味し、値 0 は行レベルの追跡が使用されていることを意味します。
パブリッシャー側のパブリケーション データベースで、 sp_changemergearticleを実行します。 @propertyにはcolumn_trackingの値を指定し、@valueには次のいずれかの値を指定します。
- true - アーティクルの列レベルの追跡を使用します。
- false - 既定の行レベルの追跡を使用します。
1 を@force_invalidate_snapshotと@force_reinit_subscriptionの両方に指定します。
削除の追跡
注
この機能は、今後のバージョンの Microsoft SQL Server で削除される予定です。 新しい開発作業ではこの機能を使用しないでください。現在この機能を使用しているアプリケーションを変更することを計画してください。
既定では、マージ レプリケーションはパブリッシャーとサブスクライバーの間で DELETE コマンドを同期します。 マージ レプリケーションを使用すると、パブリケーションから削除された場合でも、サブスクリプション データベース内の行を保持できます。また、その逆も可能です。 新しいアーティクルを作成するときに DELETE コマンドを無視することをプログラムで指定することも、後でレプリケーション ストアド プロシージャを使用してこの機能を有効にすることもできます。
重要
この機能を有効にすると、非収束が発生します。つまり、サブスクライバーに存在するデータはパブリッシャーのデータを正確に反映しません。 削除された行を手動で削除するには、独自のメカニズムを実装する必要があります。
新しい統合記事に対して削除を無視することを指定する
パブリッシャー側のパブリケーション データベースで、 sp_addmergearticle (Transact-SQL) を実行します。 `@delete_tracking に対して
false
の値を指定します。` 詳細については、 アーティクルの定義を参照してください。注
アーティクルのソース テーブルが既に別のパブリケーションに発行されている場合、 delete_tracking の値は両方のアーティクルで同じである必要があります。
既存のマージ アーティクルの削除を無視することを指定する
アーティクルに対してエラー補正が有効になっているかどうかを判断するには、 sp_helpmergearticle (Transact-SQL) を実行し、結果セット内の delete_tracking の値をメモします。 この値が 0 の場合、削除は既に無視されています。
手順 1 の値が 1 の場合は、パブリッシャー側のパブリケーション データベース で sp_changemergearticle (Transact-SQL) を実行します。 delete_trackingに対して@propertyの値を指定し、
false
に対して@valueの値を指定します。注
アーティクルのソース テーブルが既に別のパブリケーションに発行されている場合、 delete_tracking の値は両方のアーティクルで同じである必要があります。
処理順序
マージ レプリケーションを使用すると、同期プロセス中にマージ エージェントによってアーティクルを処理する順序を指定できます。 レプリケーション ストアド プロシージャを使用してアーティクルを作成するときに、各アーティクルに注文をプログラムで割り当てることができます。 アーティクルは、値が最も低い順に処理されます。 2 つのアーティクルの値が同じ場合、それらは同時に処理されます。 詳細については、「Specify Merge Replication properties」 (マージ レプリケーションのプロパティの指定) を参照してください。
Microsoft SQL Server 2005 以降では、マージ パブリケーションのアーティクル処理の既定の順序をオーバーライドできます。 これは、たとえば、トリガーを使用して参照整合性を定義し、それらのトリガーが特定の順序で起動する必要がある場合に便利です。
処理順序の決定方法
マージ同期中、アーティクルは、既定では、基本テーブルで定義されている宣言参照整合性 (DRI) 制約を含め、オブジェクト間の依存関係で必要な順序で処理されます。 処理には、テーブルへの変更の列挙と、それらの変更の適用が含まれます。 DRI が存在せず、テーブル アーティクル間に結合フィルターまたは論理レコードが存在する場合、アーティクルはフィルターと論理レコードで必要な順序で処理されます。 DRI、結合フィルター、論理レコード、またはその他の依存関係を介して他のアーティクルに関連しないアーティクルは、 シスメギアティックス (Transact-SQL) システム テーブルのアーティクルニックネームに従って処理されます。
SalesOrderHeader テーブルの主キー列 SalesOrderID と SalesOrderDetail テーブルの対応する外部キー列 SalesOrderID を持つ SalesOrderHeader テーブルと SalesOrderDetail テーブルを含むパブリケーションについて考えてみましょう。 同期中、マージ レプリケーションでは、SalesOrderDetail に関連付けられている行を挿入する前に SalesOrderHeader に新しい行を挿入することで、外部キー違反を防ぐことができます。 同様に、関連付けられている行が SalesOrderHeader から削除される前に、 SalesOrderDetail から行が削除されます。
ただし、一部のアプリケーションでは、参照整合性は DRI ではなく、データベース トリガーまたはアプリケーション レベルで適用されます。 前述のパブリケーションでは、DRI の代わりに 、SalesOrderDetail テーブルに挿入トリガーがあり、挿入を許可する前に SalesOrderHeader テーブルに関連付けられている行が確実に存在することを確認できます。 SalesOrderHeader には、削除を許可する前に 、SalesOrderDetail に関連付けられている行がないことを確認する削除トリガーが含まれる場合があります。 マージ レプリケーションでは、アーティクルの処理順序を決定するときにトリガーは考慮されません。これは、トリガーが発生するまでトリガーの結果が何であるかを判断できないためです。 同様に、レプリケーションでは、アプリケーション レベルで定義されている制約を考慮することはできません。
参照整合性がトリガーまたはアプリケーション レベルで維持される場合は、アーティクルを処理する順序を指定する必要があります。 トリガーがある例では、アーティクルの順序は挿入順序に基づいているため、 SalesOrderDetail の前に SalesOrderHeader テーブルを処理することを指定します。 マージ レプリケーションでは、削除の順序が自動的に逆になります。 マージ エージェントは制約違反が発生した場合でもアーティクルの処理を続行するため、マージ レプリケーションはアーティクルの順序付けなしでは失敗しません。その後、他のアーティクルが処理された後に失敗したすべての操作が再試行されます。 アーティクルの順序を指定すると、再試行と、それらに関連付けられている追加の処理が回避されます。 正しくない順序 (ヘッダー レコードの前に詳細レコードが処理される順序など) を指定した場合、マージ レプリケーションは成功するまで処理を再試行します。
新しい記事
パブリッシャー側のパブリケーション データベースで、 sp_addmergearticle (Transact-SQL) を実行します。 @processing_orderのアーティクルの処理順序を表す整数値を指定 します。 詳細については、 アーティクルの定義を参照してください。
注
注文済みアーティクルを作成するときは、アーティクルの注文値間にギャップを残す必要があります。 これにより、将来新しい値を簡単に設定できるようになります。 たとえば、固定処理順序を指定する必要があるアーティクルが 3 つある場合は、それぞれ 1、2、3 ではなく 10、20、30 に @processing_order の値を設定します。
既存の記事
アーティクルの処理順序を決定するには、 sp_helpmergearticle (Transact-SQL) を実行し、結果セット内の processing_order の値をメモします。
パブリッシャー側のパブリケーション データベースで、 sp_changemergearticle (Transact-SQL) を実行します。 @propertyのprocessing_orderの値と、@valueの処理順序を表す整数値を指定します。
こちらもご覧ください
条件付き削除追跡を使用してマージ レプリケーションのパフォーマンスを最適化する
論理レコードの競合の検出と解決
マージ テーブル アーティクル間の論理レコード リレーションシップを定義する
マージ レプリケーションの競合の検出と解決
Download-Only アーティクルを使用してマージ レプリケーションのパフォーマンスを最適化する
アーティクルを定義する
アーティクルのプロパティの表示と変更