SQL Server では、レプリケーション トポロジ内のすべてのユーザーが構成できる機能へのプログラムによるアクセスは、システム ストアド プロシージャによって提供されます。 ストアド プロシージャは SQL Server Management Studio または sqlcmd コマンド ライン ユーティリティを使用して個別に実行できますが、レプリケーション タスクの論理シーケンスを実行するために実行できるスクリプト ファイル Transact-SQL 書き込む方が有益な場合があります。
レプリケーション タスクのスクリプト作成には、次の利点があります。
レプリケーション トポロジのデプロイに使用する手順の永続的なコピーを保持します。
1 つのスクリプトを使用して複数のサブスクライバーを構成します。
新しいデータベース管理者がコードを評価、理解、変更、またはトラブルシューティングできるようにすることで、新しいデータベース管理者をすばやく教育します。
重要
スクリプトはセキュリティの脆弱性の原因になる可能性があります。ユーザーの知識や介入なしにシステム関数を呼び出し、プレーンテキストでセキュリティ資格情報を含めることができます。 スクリプトを使用する前に、セキュリティの問題を確認してください。
レプリケーション スクリプトの作成
レプリケーションの観点から見ると、スクリプトは、各ステートメントがレプリケーション ストアド プロシージャを実行する一連の 1 つ以上の Transact-SQL ステートメントです。 スクリプトは、多くの場合、sqlcmd ユーティリティを使用して実行できる.sqlファイル拡張子を持つテキスト ファイルです。 スクリプト ファイルを実行すると、ユーティリティはファイルに格納されている SQL ステートメントを実行します。 同様に、スクリプトは SQL Server Management Studio プロジェクトにクエリ オブジェクトとして格納できます。
レプリケーション スクリプトは、次の方法で作成できます。
スクリプトを手動で作成します。
レプリケーション ウィザードで提供されているスクリプト生成機能を使用するか、
SQL Server Management Studio。 詳細については、「 レプリケーションのスクリプト作成」を参照してください。
レプリケーション管理オブジェクト (RMO) を使用して、RMO オブジェクトを作成するスクリプトをプログラムで生成します。
レプリケーション スクリプトを手動で作成する場合は、次の点に注意してください。
Transact-SQL スクリプトには 1 つ以上のバッチがあります。 GO コマンドは、バッチの終了を通知します。 Transact-SQL スクリプトに GO コマンドがない場合は、1 つのバッチとして実行されます。
1 つのバッチで複数のレプリケーション ストアド プロシージャを実行する場合は、最初のプロシージャの後に、バッチ内の後続のすべてのプロシージャの前に EXECUTE キーワードを付ける必要があります。
バッチ内のすべてのストアド プロシージャは、バッチを実行する前にコンパイルする必要があります。 ただし、バッチがコンパイルされ、実行プランが作成されると、実行時エラーが発生する場合と発生しない場合があります。
レプリケーションを構成するスクリプトを作成するときは、Windows 認証を使用して、スクリプト ファイルにセキュリティ資格情報が格納されないようにする必要があります。 スクリプト ファイルに資格情報を格納する必要がある場合は、未承認のアクセスを防ぐためにファイルをセキュリティで保護する必要があります。
サンプル レプリケーション スクリプト
次のスクリプトを実行して、サーバーでの発行と配布を設定できます。
-- This script uses sqlcmd scripting variables. They are in the form
-- $(MyVariable). 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".
-- Install the Distributor and the distribution database.
DECLARE @distributor AS sysname;
DECLARE @distributionDB AS sysname;
DECLARE @publisher AS sysname;
DECLARE @directory AS nvarchar(500);
DECLARE @publicationDB AS sysname;
-- Specify the Distributor name.
SET @distributor = $(DistPubServer);
-- Specify the distribution database.
SET @distributionDB = N'distribution';
-- Specify the Publisher name.
SET @publisher = $(DistPubServer);
-- Specify the replication working directory.
SET @directory = N'\\' + $(DistPubServer) + '\repldata';
-- Specify the publication database.
SET @publicationDB = N'AdventureWorks2012';
-- Install the server MYDISTPUB as a Distributor using the defaults,
-- including autogenerating the distributor password.
USE master
EXEC sp_adddistributor @distributor = @distributor;
-- Create a new distribution database using the defaults, including
-- using Windows Authentication.
USE master
EXEC sp_adddistributiondb @database = @distributionDB,
@security_mode = 1;
GO
-- Create a Publisher and enable AdventureWorks2012 for replication.
-- Add MYDISTPUB as a publisher with MYDISTPUB as a local distributor
-- and use Windows Authentication.
DECLARE @distributionDB AS sysname;
DECLARE @publisher AS sysname;
-- Specify the distribution database.
SET @distributionDB = N'distribution';
-- Specify the Publisher name.
SET @publisher = $(DistPubServer);
USE [distribution]
EXEC sp_adddistpublisher @publisher=@publisher,
@distribution_db=@distributionDB,
@security_mode = 1;
GO
このスクリプトは、必要に応じて実行または再実行できるように、 instdistpub.sql
としてローカルに保存できます。
前のスクリプトには sqlcmd スクリプト変数が含まれています。これは、SQL Server オンライン ブックのレプリケーション コード サンプルの多くで使用されています。 スクリプト変数は、 $(MyVariable)
構文を使用して定義されます。 変数の値は、コマンド ラインまたは SQL Server Management Studio でスクリプトに渡すことができます。 詳細については、このトピックの次のセクション「レプリケーション スクリプトの実行」を参照してください。
レプリケーション スクリプトの実行
作成したレプリケーション スクリプトは、次のいずれかの方法で実行できます。
SQL Server Management Studio での SQL クエリ ファイルの作成
スクリプト ファイル Transact-SQL レプリケーションは、SQL Server Management Studio プロジェクトの SQL クエリ ファイルとして作成できます。 スクリプトが書き込まれた後、このクエリ ファイルのデータベースに接続でき、スクリプトを実行できます。 SQL Server Management Studio を使用して Transact-SQL スクリプトを作成する方法の詳細については、「 クエリエディターとテキスト エディター (SQL Server Management Studio)」を参照してください。
スクリプト変数を含むスクリプトを使用するには、SQL Server Management Studio が sqlcmd モードで実行されている必要があります。
sqlcmd モードでは、クエリ エディターは、変数の値に使用される:setvar
など、sqlcmd に固有の追加の構文を受け入れます。
sqlcmd モードの詳細については、「クエリ エディターを使用した SQLCMD スクリプトの編集」を参照してください。 次のスクリプトでは、 :setvar
を使用して、 $(DistPubServer)
変数の値を指定します。
:setvar DistPubServer N'MyPublisherAndDistributor';
-- Install the Distributor and the distribution database.
DECLARE @distributor AS sysname;
DECLARE @distributionDB AS sysname;
DECLARE @publisher AS sysname;
DECLARE @directory AS nvarchar(500);
DECLARE @publicationDB AS sysname;
-- Specify the Distributor name.
SET @distributor = $(DistPubServer);
-- Specify the distribution database.
SET @distributionDB = N'distribution';
-- Specify the Publisher name.
SET @publisher = $(DistPubServer);
--
-- Additional code goes here
--
コマンド ラインからの sqlcmd ユーティリティの使用
次の例は、sqlcmd ユーティリティを使用してコマンド ラインを使用して instdistpub.sql
スクリプト ファイルを実行する方法を示しています。
sqlcmd.exe -E -S sqlserverinstance -i C:\instdistpub.sql -o C:\output.log -v DistPubServer="N'MyDistributorAndPublisher'"
この例では、 -E
スイッチは、SQL Server に接続するときに Windows 認証が使用されることを示します。 Windows 認証を使用する場合、スクリプト ファイルにユーザー名とパスワードを格納する必要はありません。 スクリプト ファイルの名前とパスは -i
スイッチで指定され、出力ファイルの名前は -o
スイッチによって指定されます (このスイッチを使用すると、SQL Server からの出力はこのファイルに書き込まれます)。
sqlcmd
ユーティリティを使用すると、-v
スイッチを使用して、実行時にスクリプト変数を Transact-SQL スクリプトに渡すことができます。 この例では、 sqlcmd
スクリプト内の $(DistPubServer)
のすべてのインスタンスを、実行前に N'MyDistributorAndPublisher'
値に置き換えます。
注
-X
スイッチは、スクリプト変数を無効にします。
バッチ ファイル内のタスクの自動化
バッチ ファイルを使用すると、レプリケーション管理タスク、レプリケーション同期タスク、およびその他のタスクを同じバッチ ファイルで自動化できます。 次のバッチ ファイルでは 、sqlcmd ユーティリティを使用してサブスクリプション データベースを削除して再作成し、マージ プル サブスクリプションを追加します。 その後、ファイルによってマージ エージェントが呼び出され、新しいサブスクリプションが同期されます。
REM ----------------------Script to synchronize merge subscription ----------------------
REM -- Creates subscription database and
REM -- synchronizes the subscription to MergeSalesPerson.
REM -- Current computer acts as both Publisher and Subscriber.
REM -------------------------------------------------------------------------------------
SET Publisher=%computername%
SET Subscriber=%computername%
SET PubDb=AdventureWorks
SET SubDb=AdventureWorksReplica
SET PubName=AdvWorksSalesOrdersMerge
REM -- Drop and recreate the subscription database at the Subscriber
sqlcmd /S%Subscriber% /E /Q"USE master IF EXISTS (SELECT * FROM sysdatabases WHERE name='%SubDb%' ) DROP DATABASE %SubDb%"
sqlcmd /S%Subscriber% /E /Q"USE master CREATE DATABASE %SubDb%"
REM -- Add a pull subscription at the Subscriber
sqlcmd /S%Subscriber% /E /Q"USE %SubDb% EXEC sp_addmergepullsubscription @publisher = %Publisher%, @publication = %PubName%, @publisher_db = %PubDb%"
sqlcmd /S%Subscriber% /E /Q"USE %SubDb% EXEC sp_addmergepullsubscription_agent @publisher = %Publisher%, @publisher_db = %PubDb%, @publication = %PubName%, @subscriber = %Subscriber%, @subscriber_db = %SubDb%, @distributor = %Publisher%"
REM -- This batch file starts the merge agent at the Subscriber to
REM -- synchronize a pull subscription to a merge publication.
REM -- The following must be supplied on one line.
"\Program Files\Microsoft SQL Server\120\COM\REPLMERG.EXE" -Publisher %Publisher% -Subscriber %Subscriber% -Distributor %Publisher% -PublisherDB %PubDb% -SubscriberDB %SubDb% -Publication %PubName% -PublisherSecurityMode 1 -OutputVerboseLevel 1 -Output -SubscriberSecurityMode 1 -SubscriptionType 1 -DistributorSecurityMode 1 -Validate 3
一般的なレプリケーション タスクのスクリプト作成
システム ストアド プロシージャを使用してスクリプト化できる最も一般的なレプリケーション タスクの一部を次に示します。
発行と配布の構成
パブリッシャーとディストリビューターのプロパティの変更
発行と配布の無効化
パブリケーションの作成とアーティクルの定義
パブリケーションとアーティクルの削除
プル サブスクリプションの作成
プル サブスクリプションの変更
プル サブスクリプションの削除
プッシュ サブスクリプションの作成
プッシュ サブスクリプションの変更
プッシュ サブスクリプションの削除
プル サブスクリプションの同期
こちらもご覧ください
レプリケーションのプログラミング概念
レプリケーション ストアド プロシージャ (Transact-SQL)
スクリプト レプリケーション