トランザクション パブリケーションの更新可能なサブスクリプションの有効化
適用対象: SQL Server
このトピックでは、SQL Server で、SQL Server Management Studio または Transact-SQL を使用して、トランザクション パブリケーションのサブスクリプションを更新する方法について説明します。
Note
この機能は、 SQL Serverの将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。
始める前に
セキュリティ
可能であれば、実行時、ユーザーに対してセキュリティ資格情報の入力を要求します。 スクリプト ファイルに資格情報を格納する必要がある場合は、不正アクセスを防ぐために、ファイルを保護します。
SQL Server Management Studio を使用する
パブリケーションの新規作成ウィザードの [パブリケーションの種類] ページで、トランザクション パブリケーションの更新サブスクリプションを有効にします。
更新サブスクリプションを使用するには、サブスクリプションの新規作成ウィザードでオプションも構成する必要があります。
更新サブスクリプションを有効にするには
パブリケーションの新規作成ウィザードの [パブリケーションの種類] ページで、 [更新可能なサブスクリプションを含むトランザクション パブリケーション]を選択します。
[エージェント セキュリティ] ページで、スナップショット エージェントおよびログ リーダー エージェントの他に、キュー リーダー エージェントのセキュリティ設定を指定します。 キュー リーダー エージェントが実行されるアカウントに必要な権限の詳細については、「 Replication Agent Security Model」を参照してください。
Note
即時更新サブスクリプションのみを使用する場合でも、キュー リーダー エージェントは構成されます。
Transact-SQL の使用
レプリケーション ストアド プロシージャを使用してプログラムからトランザクション パブリケーションを作成するときに、即時更新サブスクリプションまたはキュー更新サブスクリプションを有効にできます。
即時更新サブスクリプションをサポートするパブリケーションを作成するには
必要に応じて、パブリケーション データベース用のログ リーダー エージェント ジョブを作成します。
パブリケーション データベース用のログ リーダー エージェント ジョブが既に存在する場合、手順 2. に進みます。
パブリッシュされたデータベース用のログ リーダー エージェント ジョブが存在するかどうかわからない場合は、パブリッシャー側のパブリケーション データベースに対して sp_helplogreader_agent (Transact-SQL) を実行します。 結果セットが空の場合、ログ リーダー エージェント ジョブを作成する必要があります。
パブリッシャーで、sp_addlogreader_agent (Transact-SQL) を実行します。 エージェントの実行に使用される Microsoft Windows 資格情報を @job_name と @password に指定します。 エージェントがパブリッシャーに接続する際に SQL Server 認証を使用する場合、さらに @publisher_security_mode に 0 を指定し、 Microsoft SQL Server @publisher_login と @publisher_password にログイン情報を指定する必要があります。
パラメーター @allow_sync_tran に true を指定し、sp_addpublication (Transact-SQL) を実行します。
パブリッシャーで sp_addpublication_snapshot (Transact-SQL) を実行します。 手順 2. で使用したパブリケーション名を @publication に指定し、スナップショット エージェントを実行するときに使用される Windows 資格情報を @job_name と @passwordに指定します。 エージェントがパブリッシャーに接続する際に SQL Server 認証を使用する場合、さらに @publisher_security_mode に 0 を指定し、SQL Server @publisher_login と @publisher_password にログイン情報を指定する必要があります。 これにより、パブリケーション用のスナップショット エージェント ジョブが作成されます。
パブリケーションにアーティクルを追加します。 詳しくは、「 アーティクルを定義」をご覧ください。
サブスクライバーで、このパブリケーションに対する更新サブスクリプションを作成します。
キュー更新サブスクリプションをサポートするパブリケーションを作成するには
必要に応じて、パブリケーション データベース用のログ リーダー エージェント ジョブを作成します。
パブリケーション データベース用のログ リーダー エージェント ジョブが既に存在する場合、手順 2. に進みます。
パブリッシュされたデータベース用のログ リーダー エージェント ジョブが存在するかどうかわからない場合は、パブリッシャー側のパブリケーション データベースに対して sp_helplogreader_agent (Transact-SQL) を実行します。 結果セットが空の場合、ログ リーダー エージェント ジョブを作成する必要があります。
パブリッシャーで、sp_addlogreader_agent (Transact-SQL) を実行します。 エージェントの実行に使用される Windows 資格情報を @job_name と @passwordに指定します。 エージェントがパブリッシャーに接続する際に SQL Server 認証を使用する場合、さらに @publisher_security_mode に 0 を指定し、SQL Server @publisher_login と @publisher_password にログイン情報を指定する必要があります。
必要に応じて、ディストリビューター用のキュー リーダー エージェント ジョブを作成します。
ディストリビューション データベース用のキュー リーダー エージェント ジョブが既に存在する場合、手順 3. に進みます。
ディストリビューション データベース用のキュー リーダー エージェント ジョブが存在するかどうかわからない場合は、ディストリビューター側のディストリビューション データベースに対して sp_helpqreader_agent (Transact-SQL) を実行します。 結果セットが空の場合、キュー リーダー エージェント ジョブを作成する必要があります。
ディストリビューターで、sp_addqreader_agent (Transact-SQL) を実行します。 エージェントの実行に使用される Windows 資格情報を @job_name と @passwordに指定します。 これらの資格情報は、キュー リーダー エージェントがパブリッシャーとサブスクライバーに接続するときに使用されます。 詳細については、「 レプリケーション エージェント セキュリティ モデル」を参照してください。
パラメーター @allow_queued_tran に true を指定し、 @conflict_policy に pub wins、sub reinit、または sub wins を指定して、sp_addpublication (Transact-SQL) を実行します。
パブリッシャーで sp_addpublication_snapshot (Transact-SQL) を実行します。 手順 3. で使用したパブリケーション名を @publication に指定し、スナップショット エージェントを実行するときに使用される Windows 資格情報を @snapshot_job_name と @passwordに指定します。 エージェントがパブリッシャーに接続する際に SQL Server 認証を使用する場合、さらに @publisher_security_mode に 0 を指定し、SQL Server @publisher_login と @publisher_password にログイン情報を指定する必要があります。 これにより、パブリケーション用のスナップショット エージェント ジョブが作成されます。
パブリケーションにアーティクルを追加します。 詳しくは、「 アーティクルを定義」をご覧ください。
サブスクライバーで、このパブリケーションに対する更新サブスクリプションを作成します。
キュー更新サブスクリプションが可能なパブリケーションの競合ポリシーを変更するには
- パブリッシャー側のパブリケーション データベースに対して sp_changepublication (Transact-SQL) を実行します。 @property に conflict_policy を指定し、 pub wins、 sub reinit、または sub wins のいずれかの競合ポリシー モードを @valueに指定します。
例 (Transact-SQL)
この例では、即時更新プル サブスクリプションとキュー更新プル サブスクリプションの両方がサポートされるパブリケーションを作成します。
-- To avoid storing the login and password in the script file, the values
-- are passed into SQLCMD as scripting variables. For information about
-- how to use scripting variables on the command line and in SQL Server
-- Management Studio, see the "Executing Replication Scripts" section in
-- the topic "Programming Replication Using System Stored Procedures".
--Declarations for adding a transactional publication
DECLARE @publicationDB AS sysname;
DECLARE @publication AS sysname;
DECLARE @login AS sysname;
DECLARE @password AS sysname;
SET @publicationDB = N'AdventureWorks2022';
SET @publication = N'AdvWorksProductTran';
SET @login = $(Login);
SET @password = $(Password);
USE [AdventureWorks2022]
-- Enable transactional replication on the publication database.
EXEC sp_replicationdboption
@dbname=@publicationDB,
@optname=N'publish',
@value = N'true';
-- Execute sp_addlogreader_agent to create the agent job.
EXEC sp_addlogreader_agent
@job_login = @login,
@job_password = @password,
-- Explicitly specify the use of Windows Integrated Authentication (default)
-- when connecting to the Publisher.
@publisher_security_mode = 1;
-- Create a transactional publication that supports immediate updating,
-- queued updating, and pull subscriptions.
EXEC sp_addpublication
@publication = @publication,
@status = N'active',
@allow_sync_tran = N'true',
@allow_queued_tran = N'true',
@allow_pull = N'true',
@independent_agent = N'true',
-- Explicitly declare the related default properties
@conflict_policy = N'pub wins';
-- Create a new snapshot job for the publication, using a default schedule.
EXEC sp_addpublication_snapshot
@publication = @publication,
@job_login = @login,
@job_password = @password,
-- Explicitly specify the use of Windows Integrated Authentication (default)
-- when connecting to the Publisher.
@publisher_security_mode = 1;
GO
--Declarations for adding an article.
DECLARE @publication AS sysname;
DECLARE @article AS sysname;
DECLARE @owner AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @article = N'Product';
SET @owner = N'Production';
-- Add a horizontally and vertically filtered article for the Product table.
USE [AdventureWorks2022]
EXEC sp_addarticle
@publication = @publication,
@article = @article,
@source_table = @article,
@vertical_partition = N'false',
@type = N'logbased',
@source_owner = @owner,
@destination_owner = @owner;
GO