チュートリアル: サーバーとモバイル クライアントの間のレプリケーション (マージ) を構成する
適用対象: SQL Server
マージ レプリケーションは、中央のサーバーと、常時接続でないモバイル クライアントの間でデータを移動する際の問題を解決する有効なソリューションです。 レプリケーション ウィザードを使用すると、マージ レプリケーション トポロジを簡単に設定し、管理できます。
このチュートリアルでは、モバイル クライアント用のレプリケーション トポロジを設定する方法を学習します。 マージ レプリケーションの詳細については、マージ レプリケーションの概要に関するページを参照してください
学習する内容
このチュートリアルでは、マージ レプリケーションを使用して中央のデータベースから 1 名以上のモバイル ユーザーにデータをパブリッシュし、各ユーザーが独自にフィルター選択されたデータ サブセットを取得するようにする方法を説明します。
このチュートリアルでは、次の内容を学習します。
- マージ レプリケーションのパブリッシャーを構成する。
- マージ パブリケーションのモバイル サブスクライバーを追加する。
- マージ パブリケーションにサブスクリプションを同期する。
前提条件
このチュートリアルは、データベースの基本的な操作は理解しているが、レプリケーション機能についてはあまり詳しくないユーザーを対象としています。 このチュートリアルを開始する前に、「チュートリアル: レプリケーション用の SQL Server の準備」を完了しておく必要があります。
このチュートリアルを実行するには、SQL Server、SQL Server Management Studio (SSMS)、および AdventureWorks データベースが必要です。
パブリッシャー サーバー側 (レプリケーション元) に以下をインストールします。
- SQL Server Express または SQL Server Compact を除く、SQL Server の任意のエディション。 レプリケーションのパブリッシャーとして使用できないため除きます。
AdventureWorks2022
サンプル データベース。 セキュリティ強化のため、既定ではサンプル データベースがインストールされません。
サブスクライバー サーバー (レプリケーション先) に、SQL Server Express と SQL Server Compact を除く SQL Server の任意のエディションをインストールします。 このチュートリアルで作成するパブリケーションでは、SQL Server Express と SQL Server Compact のどちらもサポートされていません。
SQL Server Management Studio をインストールします。
SQL Server 2017 Developer Edition をインストールします。
AdventureWorks サンプル データベースをダウンロードします。 SSMS でデータベースを復元する方法の詳細については、データベースの復元に関するページを参照してください。
Note
3 つ以上離れたバージョンの SQL Server インスタンスでは、レプリケーションはサポートされていません。
SQL Server Management Studio では、固定サーバー ロール sysadmin のメンバーとしてログインし、パブリッシャーとサブスクライバーに接続する必要があります。 このロールの詳細については、「サーバー レベルのロール」を参照してください。
このチュートリアルの推定所要時間: 60 分
マージ レプリケーションのパブリッシャーの構成
このセクションでは、SQL Server Management Studio を使用してマージ パブリケーションを作成し、AdventureWorks2022
サンプル データベースの Employee テーブル、SalesOrderHeader テーブル、および SalesOrderDetail テーブルのサブセットをパブリッシュします。 ここでは、パラメーター化された行フィルターを使ってこれらのテーブルをフィルター処理し、サブスクリプションごとに一意のデータ部分が含まれるようにします。 また、マージ エージェントにより使用される SQL Server ログインをパブリケーション アクセス リスト (PAL) に追加します。
マージ パブリケーションを作成してアーティクルを定義する
SQL Server Management Studio でパブリッシャーに接続し、サーバー ノードを展開します。
オブジェクト エクスプローラーで [SQL Server エージェント] を右クリックして [開始] を選択し、SQL Server エージェントを起動します。 この方法でエージェントが起動しない場合は、SQL Server 構成マネージャーから手動で起動する必要があります。
[レプリケーション] フォルダーを展開し、[ローカル パブリケーション] を右クリックして、[新しいパブリケーション] を選択します。 パブリケーションの新規作成ウィザードが開始します。
[パブリケーション データベース] ページで [
AdventureWorks2022
] を選択し、[次へ] を選択します。[パブリケーションの種類] ページで、[マージ パブリケーション] を選択し、[次へ] を選択します。
[サブスクライバーの種類] ページで、SQL Server 2008 (10.0.x) 以降のみが選択されていることを確認し、[次へ] を選択します。
[アーティクル] ページで、[テーブル] ノードを展開します。 Employee、SalesOrderHeader、および SalesOrderDetail の 3 つのテーブルを選択します。 [次へ] を選択します。
Note
Employee テーブルには、hierarchyid データ型を持つ列 (OrganizationNode) が含まれています。 このデータ型は、SQL 2017 でのレプリケーションに対してのみサポートされています。
SQL Server 2017 より前のビルドを使用している場合は、双方向のレプリケーションでこの列を使用するとデータ損失の可能性があることを通知するメッセージが画面の下部に表示されます。 このチュートリアルでは、このメッセージは無視してかまいません。 ただし、このデータ型は、サポートされているビルドを使用している場合を除き、実稼働環境でレプリケートしないでください。
hierarchyid データ型のレプリケーションに関する詳細は、「レプリケートされたテーブルでの hierarchyid 列の使用」を参照してください。
[テーブル行のフィルター選択] ページで、[追加]、[フィルターの追加] の順に選択します。
[フィルターの追加] ダイアログ ボックスの [フィルターを適用するテーブルを選択します。] で、[Employee (HumanResources)] を選択します。 [LoginID] 列を選択し、右矢印を選択して、この列をフィルター選択クエリの WHERE 句に追加します。さらに、WHERE 句を次のように修正します。
WHERE [LoginID] = HOST_NAME()
[このテーブルの 1 行を 1 つのサブスクリプションのみに移動する] を選択して、[OK] を選択します。
[テーブル行のフィルター選択] ページで、[Employee (Human Resources)]、[追加] の順に選択し、[選択したフィルターを拡張するために結合を追加する] を選択します。
a. [結合の追加] ダイアログ ボックスで、[結合テーブル] の下の [Sales.SalesOrderHeader] を選択します。 [JOIN ステートメントを手動で作成する] を選択し、次のように JOIN ステートメントを完成させます。
ON [Employee].[BusinessEntityID] = [SalesOrderHeader].[SalesPersonID]
b. [結合オプションを指定します] で、[一意キー] を選択して [OK] を選択します。
[テーブル行のフィルター選択] ページで、[SalesOrderHeader]、[追加] の順に選択し、[選択したフィルターを拡張するために結合を追加する] を選択します。
a. [結合の追加] ダイアログ ボックスで、 [結合テーブル] の下の [Sales.SalesOrderDetail]をクリックします。
b. [ビルダーを使用してステートメントを作成する] を選択します。
c. [プレビュー] ボックスで、JOIN ステートメントが次のようになっていることを確認します。ON [SalesOrderHeader].[SalesOrderID] = [SalesOrderDetail].[SalesOrderID]
d. [結合オプションを指定します] で、[一意キー] を選択して [OK] を選択します。 [次へ] を選択します。
[スナップショットをすぐに作成する] を選択し、[以下のスケジュールでスナップショット エージェントを実行する] をオフにして、[次へ] を選択します。
[エージェント セキュリティ] ページで、[セキュリティの設定] を選択します。 [プロセス アカウント] ボックスに「<Publisher_Machine_Name>\repl_snapshot」と入力し、このアカウントのパスワードを入力して [OK] を選択します。 [次へ] を選択します。
[ウィザードの完了] ページで、[パブリケーション名] ボックスに「AdvWorksSalesOrdersMerge」と入力し、[完了] を選択します。
パブリケーションが作成されたら、[閉じる] を選択します。 オブジェクト エクスプローラーで [レプリケーション] ノードの下の [ローカル パブリケーション] を右クリックして [更新] を選択し、新しいマージ レプリケーションを表示します。
スナップショット生成の状態を表示する
SQL Server Management Studio でパブリッシャーに接続して、サーバー ノードを展開し、[レプリケーション] フォルダーを展開します。
[ローカル パブリケーション] フォルダーを展開し、[AdvWorksSalesOrdersMerge] を右クリックして、[スナップショット エージェントの状態の表示] を選択します。
パブリケーションのスナップショット エージェントの現在の状態が表示されます。 スナップショット ジョブが正常に終了していることを確認してから次のレッスンに進みます。
マージ エージェントのログインを PAL に追加する
SQL Server Management Studio でパブリッシャーに接続して、サーバー ノードを展開し、[レプリケーション] フォルダーを展開します。
[ローカル パブリケーション] フォルダーを展開し、[AdvWorksSalesOrdersMerge] パブリケーションを右クリックして、[プロパティ] を選択します。
a. [パブリケーション アクセス リスト] ページを選択して、[追加] を選択します。
b. [パブリケーション アクセスの追加] ダイアログ ボックスで、<Publisher_Machine_Name>\repl_merge を選択し、[OK] を選択します。 [OK] をもう一度選択します。
詳細については、以下を参照してください:
マージ パブリケーションへのサブスクリプションを作成する
このセクションでは、前の手順で作成したマージ パブリケーションにサブスクリプションを追加します。 このチュートリアルでは、リモート サブスクライバー (NODE2\SQL2016) を使用します。 次に、サブスクリプション データベースにアクセス許可を設定し、新しいサブスクリプション用のフィルター選択データのスナップショットを手動で作成します。
マージ パブリケーションのサブスクライバーを追加する
SQL Server Management Studio でサブスクライバ―に接続し、サーバー ノードを展開します。 [レプリケーション] フォルダーを展開し、[ローカル サブスクリプション] フォルダーを右クリックして、[新しいサブスクリプション] を選択します。 サブスクリプションの新規作成ウィザードが起動します。
[パブリケーション] ページで、[パブリッシャー] ボックスの一覧の [SQL Server パブリッシャーの検索] を選択します。
[サーバーへの接続] ダイアログ ボックスで、[サーバー名] ボックスにパブリッシャー インスタンスの名前を入力し、[接続] を選択します。
[AdvWorksSalesOrdersMerge] を選択し、[次へ] を選択します。
[マージ エージェントの場所] ページで、[サブスクライバーで各エージェントを実行する] を選択して、[次へ] を選択します。
[サブスクライバー] ページで、サブスクライバー サーバーのインスタンス名を選択します。 [サブスクリプション データベース] の一覧から [新しいデータベース] を選択します。
[新しいデータベース] ダイアログ ボックスで、[データベース名] ボックスに「SalesOrdersReplica」と入力します。 [OK] を選択し、 [次へ] を選択します。
[マージ エージェントのセキュリティ] ページで、省略記号 [...] ボタンを選択します。 [プロセス アカウント] ボックスに「<Subscriber_Machine_Name>\repl_merge」と入力し、このアカウントのパスワードを入力します。 [OK]、[次へ]、[次へ] の順に選択します。
[同期スケジュール] ページで、[エージェント スケジュール] を [要求時にのみ実行する] に設定します。 [次へ] を選択します。
[サブスクリプションの初期化] ページで、[次の場合に初期化] ボックスの一覧から [初回同期時] を選択します。 [次へ] を選択して [サブスクリプションの種類] ページに進み、適切なサブスクリプションの種類を選択します。 このチュートリアルでは [クライアント] を使用します。 サブスクリプションの種類を選択した後、[次へ] を再び選択します。
[HOST_NAME 値] ページで、[HOST_NAME 値] ボックスに値「adventure-works\pamela0」と入力します。 [完了] を選択します。
[完了] をもう一度選択します。 サブスクリプションが作成されたら、[閉じる] を選択します。
サブスクライバー側でサーバー アクセス許可を設定する
SQL Server Management Studio でサブスクライバーに接続します。 [セキュリティ] を展開して [ログイン] を右クリックし、[新しいログイン] をクリックします。
[全般] ページで、[検索] を選択し、[オブジェクト名を入力してください] ボックスに「<Subscriber_ Machine_Name>\repl_merge」と入力します。 [名前の確認] を選択し、[OK] を選択します。
[ユーザー マッピング] ページで、[SalesOrdersReplica] データベースを選択し、[db_owner] ロールを選択します。 [セキュリティ保護可能なリソース] ページで、[トレースの変更] に [明示的] アクセス許可を付与します。 [OK] を選択します。
サブスクリプション用のフィルター選択データのスナップショットを作成する
SQL Server Management Studio でパブリッシャーに接続して、サーバー ノードを展開し、[レプリケーション] フォルダーを展開します。
[ローカル パブリケーション] フォルダーを展開し、[AdvWorksSalesOrdersMerge] パブリケーションを右クリックして、[プロパティ] を選択します。
a. [データ パーティション] ページを選択して、[追加] を選択します。
b. [データ パーティションの追加] ダイアログ ボックスで、[HOST_NAME 値] ボックスに「adventure-works\pamela0」と入力し、[OK] を選択します。
c. 新しく追加したパーティションを選択して、[今すぐ選択したスナップショットを生成する] を選択し、[OK] を選択します。
詳細については、以下を参照してください:
マージ パブリケーションにサブスクリプションを同期する
このセクションでは、SQL Server Management Studio を使用してマージ エージェントを起動して、サブスクリプションを初期化します。 この手順を使用して、パブリッシャーと同期することもできます。
同期を開始しサブスクリプションを初期化する
SQL Server Management Studio でサブスクライバーに接続します。
SQL Server エージェントが実行されていることを確認します。 実行されていない場合は、オブジェクト エクスプローラーで [SQL Server エージェント] を右クリックして [開始] を選択します。 この手順でエージェントの起動に失敗する場合は、SQL Server 構成マネージャーを使用して手動で起動する必要があります。
[レプリケーション] ノードを展開します。 [ローカル サブスクリプション] フォルダーで、SalesOrdersReplica データベースのサブスクリプションを右クリックし、[同期の状態の表示] を選択します。
[開始] を選択して、サブスクリプションを初期化します。