トランザクション パブリケーションの更新可能なサブスクリプションの作成

適用対象:SQL Server

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

トランザクション レプリケーションでは、即時更新サブスクリプションまたはキュー更新サブスクリプションを使用して、サブスクライバーで行われた変更をパブリッシャーに反映できます。 レプリケーション ストアド プロシージャを使用して、更新サブスクリプションをプログラムで作成できます。

サブスクリプションの新規作成ウィザード[更新可能なサブスクリプション] ページで、更新可能なサブスクリプションを構成します。 このページは、更新可能なサブスクリプションに対してトランザクション パブリケーションを有効にした場合にのみ使用できます。 更新可能なサブスクリプションを有効にする方法については、「トランザクション パブリケーションの更新サブスクリプションを有効にする方法」を参照してください。

パブリッシャーから更新可能なサブスクリプションを構成する

  1. Microsoft SQL Server Management Studio でパブリッシャーに接続し、サーバー ノードを展開します。

  2. [レプリケーション] フォルダーを展開し、 [ローカル パブリケーション] フォルダーを展開します。

  3. 更新サブスクリプションを有効にしたトランザクション パブリケーションを右クリックし、[新しいサブスクリプション] をクリックします。

  4. ウィザード内のページに従って、ディストリビューション エージェントが実行される場所など、サブスクリプションに対するオプションを指定します。

  5. サブスクリプションの新規作成ウィザード[更新可能なサブスクリプション] ページで、[レプリケート] が選択されていることを確認します。

  6. Commit at Publisher」ドロップダウンリストからオプションを選択してください:

    • 即時更新サブスクリプションを使用するには、[変更を同時にコミットする] を選択します。 このオプションを選択し、パブリケーションがキュー更新サブスクリプションを許可する場合 (パブリケーションの新規作成ウィザードを使用して作成されたパブリケーションの既定値)、サブスクリプション プロパティ update_modefailover に設定されます。 このモードでは、必要に応じて、後からキュー更新に切り替えることができます。

    • キュー更新サブスクリプションを使用するには、[変更をキューに登録し、可能な場合はコミット] を選択します。 このオプションを選択し、パブリケーションが即時更新サブスクリプションを許可していて (パブリケーションの新規作成ウィザードを使用して作成されたパブリケーションの既定値)、サブスクライバーが SQL Server 2005 以降を実行している場合、サブスクリプション プロパティ update_mode は queued failover に設定されます。 このモードでは、必要に応じて、後から即時更新に切り替えることができます。

    更新モードの切り替えの詳細については、「Switch Between Update Modes for an Updatable Transactional Subscription」(更新可能なトランザクション サブスクリプションの更新モードを切り替える) を参照してください。

  7. 即時更新を使用するサブスクリプション、または update_modequeued failover に設定されているサブスクリプションの場合、更新可能なサブスクリプションのログイン ページが表示されます。 [更新可能なサブスクリプション用のログイン] ページで、即時更新サブスクリプション用にパブリッシャーへの接続を作成するリンク サーバーを指定します。 接続は、サブスクライバー側で実行され、変更を Publisher に伝播するトリガーによって使用されます。 次のいずれかのオプションを選択してください。

    • [SQL Server 認証を使用して接続するリンク サーバーを作成する]。 サブスクライバーとパブリッシャーの間でリモート サーバーまたはリンク サーバーを定義していない場合は、このオプションを選択します。 レプリケーションによってリンク サーバーが作成されます。 指定するアカウントは、パブリッシャーに既に存在している必要があります。

    • [定義済みのリンク サーバーまたはリモート サーバーを使用する] sp_addserver (Transact-SQL)sp_addlinkedserver (Transact-SQL)、SQL Server Management Studio、または他の方法を使用してサブスクライバ―とパブリッシャーの間にリモート サーバーまたはリンクされたサーバーを定義した場合は、このオプションを選択します。

    リンク サーバー アカウントに必要なアクセス許可については、「サブスクライバーをセキュリティで保護する」の「キュー更新サブスクリプション」を参照してください。

  8. ウィザードを完了してください。

サブスクライバーから更新可能なサブスクリプションを構成する

  1. SQL Server Management Studio でサブスクライバ―に接続し、サーバー ノードを展開します。

  2. [レプリケーション] フォルダーを展開します。

  3. [ローカル サブスクリプション] フォルダーを右クリックし、 [新しいサブスクリプション]をクリックします。

  4. 新しい購読ウィザードの出版ページで、Publisherドロップダウンリストから「SQL Server Publisherを探す」を選択してください。

  5. [サーバーへの接続] ダイアログ ボックスでパブリッシャーに接続します。

  6. [パブリケーション] ページで、更新サブスクリプションを有効にしたトランザクション パブリケーションを選択します。

  7. ウィザード内のページに従って、ディストリビューション エージェントが実行される場所など、サブスクリプションに対するオプションを指定します。

  8. サブスクリプションの新規作成ウィザードの [更新可能なサブスクリプション] ページで、[レプリケート] が選択されていることを確認します。

  9. Commit at Publisher」ドロップダウンリストからオプションを選択してください:

    • 即時更新サブスクリプションを使用するには、[変更を同時にコミットする] を選択します。 このオプションを選択し、パブリケーションがキュー更新サブスクリプションを許可する場合 (パブリケーションの新規作成ウィザードを使用して作成されたパブリケーションの既定値)、サブスクリプション プロパティ update_modefailover に設定されます。 このモードでは、必要に応じて、後からキュー更新に切り替えることができます。

    • キュー更新サブスクリプションを使用するには、[変更をキューに登録し、可能な場合はコミット] を選択します。 このオプションを選択し、パブリケーションが即時更新サブスクリプションを許可していて (パブリケーションの新規作成ウィザードを使用して作成されたパブリケーションの既定値)、サブスクライバーが SQL Server 2005 以降を実行している場合、サブスクリプション プロパティ update_mode は queued failover に設定されます。 このモードでは、必要に応じて、後から即時更新に切り替えることができます。

    更新モードの切り替えの詳細については、「Switch Between Update Modes for an Updatable Transactional Subscription」(更新可能なトランザクション サブスクリプションの更新モードを切り替える) を参照してください。

  10. 更新可能なサブスクリプションのログイン ページは、即時更新を使用するサブスクリプション、または update_mode がキューに登録された フェイルオーバー に設定されているサブスクリプションに対して表示されます。 [更新可能なサブスクリプション用のログイン] ページで、即時更新サブスクリプション用にパブリッシャーへの接続を作成するリンク サーバーを指定します。 接続は、サブスクライバー側で実行され、変更を Publisher に伝播するトリガーによって使用されます。 次のいずれかのオプションを選択してください。

    • [SQL Server 認証を使用して接続するリンク サーバーを作成する]。 サブスクライバーとパブリッシャーの間でリモート サーバーまたはリンク サーバーを定義していない場合は、このオプションを選択します。 レプリケーションによってリンク サーバーが作成されます。 指定するアカウントは、パブリッシャーに既に存在している必要があります。

    • [定義済みのリンク サーバーまたはリモート サーバーを使用する] sp_addserver (Transact-SQL)sp_addlinkedserver (Transact-SQL)、SQL Server Management Studio、または他の方法を使用してサブスクライバ―とパブリッシャーの間にリモート サーバーまたはリンクされたサーバーを定義した場合は、このオプションを選択します。

    リンク サーバー アカウントに必要なアクセス許可については、「サブスクライバーをセキュリティで保護する」の「キュー更新サブスクリプション」を参照してください。

  11. ウィザードを完了してください。

即時更新プル サブスクリプションを作成する

  1. パブリッシャーで、 sp_helppublicationを実行することにより、パブリケーションが即時更新サブスクリプションをサポートしていることを確認します。

    • 結果セットの allow_sync_tran の値が 1である場合、パブリケーションは即時更新サブスクリプションをサポートします。
    • 結果セットの allow_sync_tran の値が 0である場合は、即時更新サブスクリプションを有効にしてパブリケーションを再作成する必要があります。
  2. パブリッシャーで、 sp_helppublicationを実行することにより、パブリケーションがプル サブスクリプションをサポートしていることを確認します。

    • 結果セットの allow_pull の値が 1である場合、パブリケーションはプル サブスクリプションをサポートします。
    • allow_pull の値が 0 の場合は、@propertyallow_pull を、@valuetrue を指定して、sp_changepublication を実行します。
  3. サブスクライバーで、 sp_addpullsubscriptionを実行します。 @publisher@publicationを指定し、 @update_modeに次のいずれかの値を指定します。

    • sync tran - サブスクリプションの即時更新を有効にします。
    • failover キュー更新をフェールオーバー オプションとするサブスクリプションの即時更新を有効にします。

    failover では、パブリケーションについてもキュー更新サブスクリプション用に有効化されている必要があります。

  4. サブスクライバーで、 sp_addpullsubscription_agentを実行します。 次を指定します:

    • @publisher@publisher_db@publication の各パラメーター。
    • @job_login および @job_passwordに、サブスクライバーでディストリビューション エージェントを実行するときに使用する Microsoft Windows 資格情報。

    Windows 統合認証を使用して作成された接続では、常に、 @job_login および @job_passwordで指定された Windows 資格情報が使用されます。 ディストリビューション エージェントは、常に Windows 統合認証を使用してサブスクライバーへのローカル接続を作成します。 既定では、エージェントは Windows 統合認証を使用してディストリビューターに接続します。

    • (省略可能) ディストリビューターに接続するときに SQL Server 認証を使用する必要がある場合、 0 には @distributor_security_mode@distributor_login@distributor_passwordには Microsoft SQL Server ログイン情報の値。
    • このサブスクリプションでのディストリビューション エージェント ジョブのスケジュール。
  5. サブスクライバー側のサブスクリプション データベースに対して、 sp_link_publicationを実行します。 @publisher@publication を指定し、@publisher_db にパブリケーション データベース名を、@security_mode に次のいずれかの値を指定します。

    • 0 - パブリッシャーで更新を作成する場合に SQL Server 認証を使用します。 このオプションを使用するには、パブリッシャーで @login@password に対して有効なログインを指定する必要があります。
    • 1 - パブリッシャーへの接続時に、サブスクライバー側で変更を行うユーザーのセキュリティ コンテキストを使用します。 このセキュリティ モードに関連する制限の詳細については、 sp_link_publication のトピックを参照してください。
    • 2 - sp_addlinkedserverを使って作成された、既存のユーザー定義リンク サーバー ログインを使用します。
  6. パブリッシャーで、@publication@subscriber@destination_db@subscription_type には pull の値、および @update_mode には手順 3 で指定したものと同じ値を指定して、sp_addsubscription を実行します。 これにより、パブリッシャーでプル サブスクリプションが登録されます。

即時更新プッシュ サブスクリプションを作成する

  1. パブリッシャーで、 sp_helppublicationを実行することにより、パブリケーションが即時更新サブスクリプションをサポートしていることを確認します。

    • 結果セットの allow_sync_tran の値が 1である場合、パブリケーションは即時更新サブスクリプションをサポートします。
    • 結果セットの allow_sync_tran の値が 0である場合は、即時更新サブスクリプションを有効にしてパブリケーションを再作成する必要があります。
  2. パブリッシャーで、 sp_helppublicationを実行することにより、パブリケーションがプッシュ サブスクリプションをサポートしていることを確認します。

    • 結果セットの allow_push の値が 1である場合、パブリケーションはプッシュ サブスクリプションをサポートします。
    • allow_push の値が 0 の場合は、@propertyallow_push を、@valuetrue を指定して、sp_changepublication を実行します。
  3. パブリッシャーで、 sp_addsubscriptionを実行します。 @publication@subscriber@destination_db を指定し、@update_mode に次のいずれかの値を指定します。

    • sync tran - 即時更新のサポートを有効にします。
    • failover - キュー更新をフェールオーバー オプションとする即時更新のサポートを有効にします。

    failover では、パブリケーションについてもキュー更新サブスクリプション用に有効化されている必要があります。

  4. パブリッシャーで、 sp_addpushsubscription_agentを実行します。 次のパラメーターを指定します。

    • @subscriber@subscriber_db、および @publication

    • @job_login および @job_passwordのディストリビューターでディストリビューション エージェントを実行する際に使用する Windows 資格情報。

    Windows 統合認証を使用して作成された接続では、常に、 @job_login および @job_passwordで指定された Windows 資格情報が使用されます。 ディストリビューション エージェントは、常に Windows 統合認証を使用してディストリビューターにローカル接続します。 既定では、エージェントは Windows 統合認証を使用してサブスクライバーに接続します。

    • (省略可能) サブスクライバーへの接続時に SQL Server 認証を使用する必要がある場合は、@subscriber_security_mode に対する 0 の値と、@subscriber_login および @subscriber_password の SQL Server ログイン情報。
    • このサブスクリプションでのディストリビューション エージェント ジョブのスケジュール。
  5. サブスクライバー側のサブスクリプション データベースに対して、 sp_link_publicationを実行します。 @publisher@publication を指定し、@publisher_db にパブリケーション データベース名を、@security_mode に次のいずれかの値を指定します。

    • 0 - パブリッシャーで更新を作成する場合に SQL Server 認証を使用します。 このオプションを使用するには、パブリッシャーで @login@password に対して有効なログインを指定する必要があります。
    • 1 - パブリッシャーへの接続時に、サブスクライバー側で変更を行うユーザーのセキュリティ コンテキストを使用します。 このセキュリティ モードに関連する制限の詳細については、 sp_link_publication のトピックを参照してください。
    • 2 - sp_addlinkedserverを使って作成された、既存のユーザー定義リンク サーバー ログインを使用します。

キュー更新型プル サブスクリプションを作成する

  1. パブリッシャーで、 sp_helppublicationを実行することにより、パブリケーションがキュー更新サブスクリプションをサポートしていることを確認します。

    • 結果セットの allow_queued_tran の値が 1である場合、パブリケーションは即時更新サブスクリプションをサポートします。
    • 結果セットの allow_queued_tran の値が 0である場合は、キュー更新サブスクリプションを有効にしてパブリケーションを再作成する必要があります。
  2. パブリッシャーで、 sp_helppublicationを実行することにより、パブリケーションがプル サブスクリプションをサポートしていることを確認します。

    • 結果セットの allow_pull の値が 1である場合、パブリケーションはプル サブスクリプションをサポートします。
    • allow_pull の値が 0 の場合は、@propertyallow_pull を、@valuetrue を指定して、sp_changepublication を実行します。
  3. サブスクライバーで、 sp_addpullsubscriptionを実行します。 @publisher@publicationを指定し、 @update_modeに次のいずれかの値を指定します。

    • queued tran - キュー更新用のサブスクリプションを有効にします。
    • queued failover - 即時更新をフェールオーバー オプションとするキュー更新のサポートを有効にします。

    queued failover では、パブリケーションについても即時更新サブスクリプションが有効になっている必要があります。 即時更新へのフェールオーバーを行うために、 sp_link_publication を使って、サブスクライバーでの変更をパブリッシャーにレプリケートするときに使用する資格情報を定義する必要があります。

  4. サブスクライバーで、 sp_addpullsubscription_agentを実行します。 次のパラメーターを指定します。

    • @publisher、 @publisher_db、および @publication
    • @job_login および @job_password で、サブスクライバー側のディストリビューション エージェントの実行に使用される Windows 資格情報。

    Windows 統合認証を使用して作成された接続では、常に、 @job_login および @job_passwordで指定された Windows 資格情報が使用されます。 ディストリビューション エージェントは、常に Windows 統合認証を使用してサブスクライバーへのローカル接続を作成します。 既定では、エージェントは Windows 統合認証を使用してディストリビューターに接続します。

    • (省略可能) ディストリビューターに接続するときに SQL Server 認証を使用する必要がある場合、 0 には @distributor_security_mode@distributor_login@distributor_passwordには SQL Server ログイン情報の値。
    • このサブスクリプションでのディストリビューション エージェント ジョブのスケジュール。
  5. パブリッシャーで、sp_addsubscriber を実行して、@publication@subscriber@destination_db を指定し、@subscription_type には pull の値を、@update_mode には手順 3 で指定したものと同じ値を指定して、パブリッシャーにサブスクライバーを登録します。 これにより、パブリッシャーでプル サブスクリプションが登録されます。

キューに登録された更新プッシュ サブスクリプションを作成する

  1. パブリッシャーで、 sp_helppublicationを実行することにより、パブリケーションがキュー更新サブスクリプションをサポートしていることを確認します。

    • 結果セットの allow_queued_tran の値が 1 である場合、パブリケーションは即時更新サブスクリプションをサポートします。
    • 結果セットの allow_queued_tran の値が 0 である場合は、キュー更新サブスクリプションを有効にしてパブリケーションを再作成する必要があります。 詳細については、「トランザクション パブリケーションに対するサブスクリプションの更新を有効にする方法 (レプリケーション Transact-SQL プログラミング)」を参照してください。
  2. パブリッシャーで、 sp_helppublicationを実行することにより、パブリケーションがプッシュ サブスクリプションをサポートしていることを確認します。

    • 結果セットの allow_push の値が 1である場合、パブリケーションはプッシュ サブスクリプションをサポートします。
    • allow_push の値が 0である場合、 には allow_push、には @property を指定して true sp_changepublication @valueを実行します。
  3. パブリッシャーで、 sp_addsubscriptionを実行します。 @publication@subscriber@destination_db を指定し、@update_mode に次のいずれかの値を指定します。

    • queued tran - キュー更新用のサブスクリプションを有効にします。
    • queued failover - 即時更新をフェールオーバー オプションとするキュー更新のサポートを有効にします。

    キューに登録されたフェールオーバー オプションでは、パブリケーションが即時更新サブスクリプションに対しても有効になっている必要があります。 即時更新へのフェールオーバーを行うために、 sp_link_publication を使って、サブスクライバーでの変更をパブリッシャーにレプリケートするときに使用する資格情報を定義する必要があります。

  4. パブリッシャーで、 sp_addpushsubscription_agentを実行します。 次のパラメーターを指定します。

    • @subscriber@subscriber_db、および @publication
    • @job_login および @job_passwordのディストリビューターでディストリビューション エージェントを実行する際に使用する Windows 資格情報。

    Windows 統合認証を使用して作成された接続では、常に、 @job_login および @job_passwordで指定された Windows 資格情報が使用されます。 ディストリビューション エージェントは、常に Windows 統合認証を使用してディストリビューターにローカル接続します。 既定では、エージェントは Windows 統合認証を使用してサブスクライバーに接続します。

    • (省略可能) サブスクライバーへの接続時に SQL Server 認証を使用する必要がある場合は、@subscriber_security_mode に対する 0 の値と、@subscriber_login および @subscriber_password の SQL Server ログイン情報。
    • このサブスクリプションでのディストリビューション エージェント ジョブのスケジュール。

キューに登録された更新の競合解決オプションを設定する

Publication Properties - <Publication ダイアログ ボックスの Subscription Options ページで、キュー更新サブスクリプションをサポートするパブリケーションの競合解決オプションを設定します。 このダイアログ ボックスへのアクセス方法の詳細については、「パブリケーション プロパティの表示および変更」を参照してください。

  1. サブスクリプション オプション ページの パブリケーションのプロパティ - パブリケーション ダイアログ ボックスで、競合の解決ポリシー オプションの値として、次のいずれかを選択します。

    • 発行元の変更を保持
    • [サブスクライバーの変更を保持します]
    • [サブスクリプションを再初期化します]

この例では、即時更新サブスクリプションをサポートするパブリケーションに対する即時更新プル サブスクリプションを作成します。 ログインとパスワードの値は、実行時に sqlcmd スクリプト変数を使用して入力されます。

このスクリプトでは sqlcmd スクリプト変数を使用します。 $(MyVariable)という形式です。 コマンド ラインと SQL Server Management Studio でスクリプト変数を使用する方法については、「 レプリケーション システム ストアド プロシージャの概念 」トピックの「 レプリケーション スクリプトの実行」セクションを参照してください。

-- Execute this batch at the Subscriber.
DECLARE @publication AS sysname;
DECLARE @publicationDB AS sysname;
DECLARE @publisher AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS NVARCHAR(512);
SET @publication = N'AdvWorksProductTran';
SET @publicationDB = N'AdventureWorks2022';
SET @publisher = $(PubServer);
SET @login = $(Login);
SET @password = $(Password);

-- At the subscription database, create a pull subscription to a transactional 
-- publication using immediate updating with queued updating as a failover.
EXEC sp_addpullsubscription
    @publisher = @publisher,
    @publication = @publication,
    @publisher_db = @publicationDB,
    @update_mode = N'failover',
    @subscription_type = N'pull';

-- Add an agent job to synchronize the pull subscription, 
-- which uses Windows Authentication when connecting to the Distributor.
EXEC sp_addpullsubscription_agent
    @publisher = @publisher,
    @publisher_db = @publicationDB,
    @publication = @publication,
    @job_login = @login,
    @job_password = @password;

-- Add a Windows Authentication-based linked server that enables the 
-- Subscriber-side triggers to make updates at the Publisher. 
EXEC sp_link_publication
    @publisher = @publisher,
    @publication = @publication,
    @publisher_db = @publicationDB,
    @security_mode = 0,
    @login = @login,
    @password = @password;
GO

USE AdventureWorks2022;
GO

-- Execute this batch at the Publisher.
DECLARE @publication AS sysname;
DECLARE @subscriptionDB AS sysname;
DECLARE @subscriber AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @subscriptionDB = N'AdventureWorks2022Replica';
SET @subscriber = $(SubServer);

-- At the Publisher, register the subscription, using the defaults.
USE AdventureWorks2022;
EXEC sp_addsubscription
    @publication = @publication,
    @subscriber = @subscriber,
    @destination_db = @subscriptionDB,
    @subscription_type = N'pull',
    @update_mode = N'failover';
GO