このトピックでは、SQL Server Management Studio、Transact-SQL、またはレプリケーション管理オブジェクト (RMO) を使用して SQL Server 2014 でプル サブスクリプションを作成する方法について説明します。
P2P レプリケーションのプル サブスクリプションの設定はスクリプトによって可能ですが、ウィザードでは使用できません。
SQL Server Management Studio の使用
サブスクリプションの新規作成ウィザードを使用して、パブリッシャーまたはサブスクライバーでプル サブスクリプションを作成します。 ウィザードのページに従って、次の操作を行います。
パブリッシャーとパブリケーションを指定します。
レプリケーション エージェントを実行する場所を選択します。 プル サブスクリプションの場合は、パブリケーションの種類に応じて、[ディストリビューション エージェントの場所] ページまたは [マージ エージェントの場所] ページの [サブスクライバー (プル サブスクリプション)] で各エージェントを実行するを選択します。
サブスクライバーデータベースとサブスクリプションデータベースを指定します。
レプリケーション エージェントによって行われる接続に使用するログインとパスワードを指定します。
スナップショット パブリケーションとトランザクション パブリケーションのサブスクリプションの場合は、[ ディストリビューション エージェントのセキュリティ ] ページで資格情報を指定します。
マージ パブリケーションのサブスクリプションの場合は、[ マージ エージェントのセキュリティ ] ページで資格情報を指定します。
各エージェントに必要なアクセス許可については、 レプリケーション エージェントのセキュリティ モデルに関するセクションを参照してください。
同期スケジュールとサブスクライバーを初期化するタイミングを指定します。
マージ パブリケーションの追加オプションを指定する: サブスクリプションの種類。パラメーター化されたフィルター処理の値。パブリケーションが Web 同期に対して有効になっている場合は、HTTPS による同期に関する情報が含まれます。
サブスクリプションの更新を許可するトランザクション パブリケーションの追加オプションを指定します。サブスクライバーがパブリッシャーで変更を直ちにコミットするか、キューに書き込むかを指定します。サブスクライバーからパブリッシャーへの接続に使用される資格情報。
必要に応じて、サブスクリプションをスクリプト化します。
パブリッシャーからプル サブスクリプションを作成するには
Microsoft SQL Server Management Studio でパブリッシャーに接続し、サーバー ノードを展開します。
[レプリケーション] フォルダーを展開し、[ローカル パブリケーション] フォルダーを展開します。
1 つ以上のサブスクリプションを作成するパブリケーションを右クリックし、[ 新しいサブスクリプション] をクリックします。
サブスクリプションの新規作成ウィザードのページを完了します。
サブスクライバーからプル サブスクリプションを作成するには
SQL Server Management Studio でサブスクライバーに接続し、サーバー ノードを展開します。
[レプリケーション] フォルダーを展開します。
[ローカル サブスクリプション] フォルダーを右クリックし、[新しいサブスクリプション] をクリックします。
サブスクリプションの新規作成ウィザードの [パブリケーション] ページで、[パブリッシャー] ドロップダウン リストから <Find SQL Server Publisher> または <Find Oracle Publisher> を選択します。
[サーバーへの接続] ダイアログ ボックスでパブリッシャー に接続 します。
[パブリケーション] ページで パブリケーション を選択します。
サブスクリプションの新規作成ウィザードのページを完了します。
Transact-SQL の使用
プル サブスクリプションは、レプリケーション ストアド プロシージャを使用してプログラムで作成できます。 使用されるストアド プロシージャは、サブスクリプションが属するパブリケーションの種類によって異なります。
スナップショット パブリケーションまたはトランザクション パブリケーションのプル サブスクリプションを作成するには
パブリッシャーで、sp_helppublication (Transact-SQL) を実行して、パブリケーションがプル サブスクリプションをサポートしていることを確認します。
結果セットの allow_pull の値が 1 の場合、パブリケーションはプル サブスクリプションをサポートします。
allow_pullの値が 0 の場合は、sp_changepublication (Transact-SQL) を実行し、@propertyのallow_pullと@valueの
true
を指定します。
サブスクライバーで、 sp_addpullsubscription (Transact-SQL) を実行します。 @publisherと@publicationを指定します。 サブスクリプションの更新については、「 トランザクション パブリケーションへの更新可能なサブスクリプションの作成」を参照してください。
サブスクライバーで、 sp_addpullsubscription_agent (Transact-SQL) を実行します。 次を指定します。
@publisher、@publisher_db、および@publicationパラメーター。
サブスクライバーのディストリビューション エージェントが@job_loginおよび@job_passwordに対して実行される Microsoft Windows 資格情報。
注
Windows 統合認証を使用して行われる接続では、常に @job_login と @job_passwordで指定された Windows 資格情報が使用されます。 ディストリビューション エージェントは、常に Windows 統合認証を使用してサブスクライバーにローカル接続を行います。 既定では、エージェントは Windows 統合認証を使用してディストリビューターに接続します。
(省略可能)ディストリビューターに接続するときに SQL Server 認証を使用する必要がある場合は、@distributor_security_modeの値 0、@distributor_loginと@distributor_passwordの Microsoft SQL Server ログイン情報。
このサブスクリプションのディストリビューション エージェント ジョブのスケジュール。 詳細については、「 同期スケジュールの指定」を参照してください。
パブリッシャーで 、sp_addsubscription (Transact-SQL) を実行してプル サブスクリプションを登録します。 @publication、@subscriber、および@destination_dbを指定します。 @subscription_typeの pull の値を指定します。
マージ パブリケーションのプル サブスクリプションを作成するには
パブリッシャーで、sp_helpmergepublication (Transact-SQL) を実行して、パブリケーションがプル サブスクリプションをサポートしていることを確認します。
結果セットの allow_pull の値が 1 の場合、パブリケーションはプル サブスクリプションをサポートします。
allow_pullの値が 0 の場合は、sp_changemergepublication (Transact-SQL) を実行し、@propertyのallow_pullと@valueの
true
を指定します。
サブスクライバーで、 sp_addmergepullsubscription (Transact-SQL) を実行します。 @publisher、@publisher_db、@publication、および次のパラメーターを指定します。
@subscriber_type - クライアント サブスクリプションの 場合はローカル 、サーバー サブスクリプションの場合は グローバル を指定します。
@subscription_priority - サブスクリプションの優先順位を指定します (0.00 から 99.99)。 これは、サーバー サブスクリプションでのみ必要です。
詳細については、「 高度なマージ レプリケーションの競合の検出と解決」を参照してください。
サブスクライバーで、 sp_addmergepullsubscription_agent (Transact-SQL) を実行します。 次のパラメーターを指定します。
@publisher、 @publisher_db、 および@publication。
サブスクライバーのマージ エージェントが@job_loginと@job_passwordで実行される Windows 資格情報。
注
Windows 統合認証を使用して行われる接続では、常に @job_login と @job_passwordで指定された Windows 資格情報が使用されます。 マージ エージェントは、常に Windows 統合認証を使用してサブスクライバーにローカル接続を行います。 既定では、エージェントは Windows 統合認証を使用してディストリビューターとパブリッシャーに接続します。
(省略可能)ディストリビューターに接続するときに SQL Server 認証を使用する必要がある場合は、@distributor_security_modeの値 0、@distributor_loginと@distributor_passwordの SQL Server ログイン情報。
(省略可能)パブリッシャーに接続するときに SQL Server 認証を使用する必要がある場合は、@publisher_security_modeの値 0、@publisher_loginと@publisher_passwordの SQL Server ログイン情報。
このサブスクリプションのためのマージ エージェント ジョブのスケジュール。 詳細については、「 トランザクション パブリケーションへの更新可能なサブスクリプションの作成」を参照してください。
パブリッシャーで、 sp_addmergesubscription (Transact-SQL) を実行します。 @publication、@subscriber、@subscriber_db、および@subscription_typeに対するpullの値を指定します。 これにより、プル サブスクリプションが登録されます。
例 (Transact-SQL)
次の例では、トランザクション パブリケーションへのプル サブスクリプションを作成します。 最初のバッチはサブスクライバーで実行され、2 番目のバッチはパブリッシャーで実行されます。 ログインとパスワードの値は、sqlcmd スクリプト変数を使用して実行時に指定されます。
-- 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".
-- Execute this batch at the Subscriber.
DECLARE @publication AS sysname;
DECLARE @publisher AS sysname;
DECLARE @publicationDB AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @publisher = $(PubServer);
SET @publicationDB = N'AdventureWorks2012';
-- At the subscription database, create a pull subscription
-- to a transactional publication.
USE [AdventureWorks2012Replica]
EXEC sp_addpullsubscription
@publisher = @publisher,
@publication = @publication,
@publisher_db = @publicationDB;
-- Add an agent job to synchronize the pull subscription.
EXEC sp_addpullsubscription_agent
@publisher = @publisher,
@publisher_db = @publicationDB,
@publication = @publication,
@distributor = @publisher,
@job_login = $(Login),
@job_password = $(Password);
GO
-- 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".
-- Execute this batch at the Publisher.
DECLARE @publication AS sysname;
DECLARE @subscriber AS sysname;
DECLARE @subscriptionDB AS sysname;
SET @publication = N'AdvWorksProductTran';
SET @subscriber = $(SubServer);
SET @subscriptionDB = N'AdventureWorks2012Replica';
-- At the Publisher, register the subscription, using the defaults.
EXEC sp_addsubscription
@publication = @publication,
@subscriber = @subscriber,
@destination_db = @subscriptionDB,
@subscription_type = N'pull',
@status = N'subscribed';
GO
次の例では、マージ パブリケーションへのプル サブスクリプションを作成します。 最初のバッチはサブスクライバーで実行され、2 番目のバッチはパブリッシャーで実行されます。 ログインとパスワードの値は、 sqlcmd スクリプト変数を使用して実行時に指定されます。
-- 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".
-- Execute this batch at the Subscriber.
DECLARE @publication AS sysname;
DECLARE @publisher AS sysname;
DECLARE @publicationDB AS sysname;
DECLARE @hostname AS sysname;
SET @publication = N'AdvWorksSalesOrdersMerge';
SET @publisher = $(PubServer);
SET @publicationDB = N'AdventureWorks2012';
SET @hostname = N'adventure-works\david8';
-- At the subscription database, create a pull subscription
-- to a merge publication.
USE [AdventureWorks2012Replica]
EXEC sp_addmergepullsubscription
@publisher = @publisher,
@publication = @publication,
@publisher_db = @publicationDB;
-- Add an agent job to synchronize the pull subscription.
EXEC sp_addmergepullsubscription_agent
@publisher = @publisher,
@publisher_db = @publicationDB,
@publication = @publication,
@distributor = @publisher,
@job_login = $(Login),
@job_password = $(Password),
@hostname = @hostname;
GO
-- Execute this batch at the Publisher.
DECLARE @myMergePub AS sysname;
DECLARE @mySub AS sysname;
DECLARE @mySubDB AS sysname;
SET @myMergePub = N'AdvWorksSalesOrdersMerge';
SET @mySub = N'MYSUBSERVER';
SET @mySubDB = N'AdventureWorks2012Replica';
-- At the Publisher, register the subscription, using the defaults.
USE [AdventureWorks2012]
EXEC sp_addmergesubscription @publication = @myMergePub,
@subscriber = @mySub, @subscriber_db = @mySubDB,
@subscription_type = N'pull';
GO
レプリケーション管理オブジェクト (RMO) の使用
プル サブスクリプションの作成に使用される RMO クラスは、サブスクリプションが属するパブリケーションの種類によって異なります。
スナップショット パブリケーションまたはトランザクション パブリケーションに対するプル サブスクリプションを作成するには
ServerConnection クラスを使用してサブスクライバーとパブリッシャーの両方への接続を作成します。
手順 1. のパブリッシャー接続を使用して、 TransPublication クラスのインスタンスを作成します。 Name、DatabaseName、およびConnectionContextを指定します。
LoadProperties メソッドを呼び出します。 このメソッドが
false
を返す場合、手順 2 で指定したプロパティが正しくないか、サーバーにパブリケーションが存在しません。プロパティAttributesとAllowPullの間でビット単位の論理 AND (Visual C# では
&
、Visual Basic ではAnd
) を実行します。 結果がNoneの場合は、AttributesとAllowPullの間のビットごとの論理 OR (Visual C# では|
、Visual Basic ではOr
) の結果にAttributesを設定します。 次に、 CommitPropertyChanges を呼び出してプル サブスクリプションを有効にします。サブスクリプション データベースが存在しない場合は、 Database クラスを使用して作成します。 詳細については、「 データベースの作成、変更、および削除」を参照してください。
TransPullSubscription クラスのインスタンスを作成します。
次のサブスクリプション プロパティを設定します。
手順 1 で作成されたConnectionContextのサブスクライバーへのServerConnection。
DatabaseNameのサブスクリプション データベースの名前。
PublisherNameのパブリッシャーの名前。
PublicationDBNameのパブリケーション データベースの名前。
PublicationNameのパブリケーションの名前。
ディストリビューション エージェントがサブスクライバーで実行される Microsoft Windows アカウントの資格情報を提供するSynchronizationAgentProcessSecurityのLoginフィールドとPasswordフィールドまたはSecurePassword* フィールド。 このアカウントは、サブスクライバーへのローカル接続を行い、Windows 認証を使用してリモート接続を行うために使用されます。
注
sysadmin
固定サーバー ロールのメンバーによってサブスクリプションが作成される場合、SynchronizationAgentProcessSecurityの設定は必要ありませんが、推奨されます。 この場合、エージェントは SQL Server エージェント アカウントを偽装します。 詳細については、「 レプリケーション エージェント セキュリティ モデル」を参照してください。(省略可能)サブスクリプションの同期に使用されるエージェント ジョブを作成するCreateSyncAgentByDefaultの
true
の値。false
(既定値) を指定した場合、サブスクリプションはプログラムでのみ同期でき、SynchronizationAgent プロパティからこのオブジェクトにアクセスするときにTransSynchronizationAgentの追加プロパティを指定する必要があります。 詳細については、「 プル サブスクリプションの同期」を参照してください。注
SQL Server エージェントは、MicrosoftSQL Server のすべてのエディションで使用できるわけではありません。 SQL Server の各エディションでサポートされる機能の一覧については、「SQL Server 2014 の各エディションでサポートされる機能」を参照してください。 Express サブスクライバーに
true
の値を指定すると、エージェント ジョブは作成されません。 ただし、重要なサブスクリプション関連のメタデータはサブスクライバーに格納されます。(省略可能)SQL Server 認証を使用してディストリビューターに接続する場合は、DistributorSecurityのSqlStandardLoginフィールドとSqlStandardPasswordフィールドまたはSecureSqlStandardPassword フィールドを設定します。
Create メソッドを呼び出します。
手順 2 の TransPublication クラスのインスタンスを使用して、 MakePullSubscriptionWellKnown メソッドを呼び出して、プル サブスクリプションをパブリッシャーに登録します。 この登録が既に存在する場合は、例外が発生します。
マージ パブリケーションのプル サブスクリプションを作成するには
ServerConnection クラスを使用して、サブスクライバーとパブリッシャーの両方への接続を作成します。
手順 1. のパブリッシャー接続を使用して、 MergePublication クラスのインスタンスを作成します。 Name、DatabaseName、およびConnectionContextを指定します。
LoadProperties メソッドを呼び出します。 このメソッドが
false
を返す場合、手順 2 で指定したプロパティが正しくないか、サーバーにパブリケーションが存在しません。Attributes プロパティとAllowPullの間で、Visual C# の
&
および Visual Basic のAnd
を使用してビットごとの論理 AND を実行します。 結果がNoneの場合は、AttributesとAllowPullの間のビットごとの論理 OR (Visual C# では|
、Visual Basic ではOr
) の結果にAttributesを設定します。 次に、 CommitPropertyChanges を呼び出してプル サブスクリプションを有効にします。サブスクリプション データベースが存在しない場合は、 Database クラスを使用して作成します。 詳細については、「 データベースの作成、変更、および削除」を参照してください。
MergePullSubscription クラスのインスタンスを作成します。
次のサブスクリプション プロパティを設定します。
ConnectionContextの手順 1 で作成したサブスクライバーへのServerConnection。
DatabaseNameのサブスクリプション データベースの名前。
PublisherNameのパブリッシャーの名前。
PublicationDBNameのパブリケーション データベースの名前。
PublicationNameのパブリケーションの名前。
Loginフィールド、Passwordフィールド、またはSecurePassword*フィールドを使用して、サブスクライバーで実行されるマージ エージェントのMicrosoft Windowsアカウントの資格情報を提供するSynchronizationAgentProcessSecurity。 このアカウントは、サブスクライバーへのローカル接続を行い、Windows 認証を使用してリモート接続を行うために使用されます。
注
sysadmin
固定サーバー ロールのメンバーによってサブスクリプションが作成される場合、SynchronizationAgentProcessSecurityの設定は必要ありませんが、推奨されます。 この場合、エージェントは SQL Server エージェント アカウントを偽装します。 詳細については、「 レプリケーション エージェント セキュリティ モデル」を参照してください。(省略可能)CreateSyncAgentByDefault のための
true
の値を指定して、サブスクリプションの同期に使用されるエージェント ジョブを作成します。false
(既定値) を指定した場合、サブスクリプションはプログラムでのみ同期でき、SynchronizationAgent プロパティからこのオブジェクトにアクセスするときにMergeSynchronizationAgentの追加プロパティを指定する必要があります。 詳細については、「 プル サブスクリプションの同期」を参照してください。(省略可能)SQL Server 認証を使用してディストリビューターに接続する場合は、DistributorSecurityのSqlStandardLoginフィールドとSqlStandardPasswordフィールドまたはSecureSqlStandardPassword フィールドを設定します。
(省略可能)SQL Server 認証を使用してパブリッシャーに接続する場合は、PublisherSecurityのSqlStandardLoginフィールドとSqlStandardPasswordフィールドまたはSecureSqlStandardPassword フィールドを設定します。
Create メソッドを呼び出します。
手順 2 の MergePublication クラスのインスタンスを使用して、 MakePullSubscriptionWellKnown メソッドを呼び出して、プル サブスクリプションをパブリッシャーに登録します。 この登録が既に存在する場合は、例外が発生します。
例 (RMO)
この例では、トランザクション パブリケーションへのプル サブスクリプションを作成します。 ディストリビューション エージェント ジョブの作成に使用される Microsoft Windows アカウントの資格情報は、実行時に渡されます。
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksProductTran";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
TransPublication publication;
TransPullSubscription subscription;
try
{
// Connect to the Publisher and Subscriber.
subscriberConn.Connect();
publisherConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions.
publication = new TransPublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.IsExistingObject)
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
// Define the pull subscription.
subscription = new TransPullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
// Specify the Windows login credentials for the Distribution Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
subscription.SynchronizationAgentProcessSecurity.Password = winPassword;
// Make sure that the agent job for the subscription is created.
subscription.CreateSyncAgentByDefault = true;
// By default, subscriptions to transactional publications are synchronized
// continuously, but in this case we only want to synchronize on demand.
subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.OnDemand;
// Create the pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (TransSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName)
{
registered = true;
}
}
if (!registered)
{
// Register the subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
TransSubscriberType.ReadOnly);
}
}
else
{
// Do something here if the publication does not exist.
throw new ApplicationException(String.Format(
"The publication '{0}' does not exist on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Implement the appropriate error handling here.
throw new ApplicationException(String.Format(
"The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
subscriberConn.Disconnect();
publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksProductTran"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As TransPublication
Dim subscription As TransPullSubscription
Try
' Connect to the Publisher and Subscriber.
subscriberConn.Connect()
publisherConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions.
publication = New TransPublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.IsExistingObject Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
' Define the pull subscription.
subscription = New TransPullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
subscription.Description = "Pull subscription to " + publicationDbName _
+ " on " + subscriberName + "."
' Specify the Windows login credentials for the Distribution Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin
subscription.SynchronizationAgentProcessSecurity.Password = winPassword
' Make sure that the agent job for the subscription is created.
subscription.CreateSyncAgentByDefault = True
' By default, subscriptions to transactional publications are synchronized
' continuously, but in this case we only want to synchronize on demand.
subscription.AgentSchedule.FrequencyType = ScheduleFrequencyType.OnDemand
' Create the pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As TransSubscription In publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName And _
existing.SubscriptionDBName = subscriptionDbName Then
registered = True
End If
Next existing
If Not registered Then
' Register the subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
TransSubscriberType.ReadOnly)
End If
Else
' Do something here if the publication does not exist.
Throw New ApplicationException(String.Format( _
"The publication '{0}' does not exist on {1}.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Implement the appropriate error handling here.
Throw New ApplicationException(String.Format( _
"The subscription to {0} could not be created.", publicationName), ex)
Finally
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try
この例では、マージ パブリケーションへのプル サブスクリプションを作成します。 マージ エージェント ジョブの作成に使用される Windows アカウントの資格情報は、実行時に渡されます。
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
string hostname = @"adventure-works\garrett1";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;
try
{
// Connect to the Subscriber.
subscriberConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions.
publication = new MergePublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.LoadProperties())
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
// Define the pull subscription.
subscription = new MergePullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
subscription.HostName = hostname;
// Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
subscription.SynchronizationAgentProcessSecurity.Password = winPassword;
// Make sure that the agent job for the subscription is created.
subscription.CreateSyncAgentByDefault = true;
// Create the pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (MergeSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName
&& existing.SubscriptionType == SubscriptionOption.Pull)
{
registered = true;
}
}
if (!registered)
{
// Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
MergeSubscriberType.Local, 0);
}
}
else
{
// Do something here if the publication does not exist.
throw new ApplicationException(String.Format(
"The publication '{0}' does not exist on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Implement the appropriate error handling here.
throw new ApplicationException(String.Format(
"The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
subscriberConn.Disconnect();
publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
Dim hostname As String = "adventure-works\garrett1"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription
Try
' Connect to the Subscriber.
subscriberConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions.
publication = New MergePublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.LoadProperties() Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
' Define the pull subscription.
subscription = New MergePullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
subscription.HostName = hostname
' Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin
subscription.SynchronizationAgentProcessSecurity.Password = winPassword
' Make sure that the agent job for the subscription is created.
subscription.CreateSyncAgentByDefault = True
' Create the pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As MergeSubscription In _
publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName Then
registered = True
End If
Next
If Not registered Then
' Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
MergeSubscriberType.Local, 0)
End If
Else
' Do something here if the publication does not exist.
Throw New ApplicationException(String.Format( _
"The publication '{0}' does not exist on {1}.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Implement the appropriate error handling here.
Throw New ApplicationException(String.Format( _
"The subscription to {0} could not be created.", publicationName), ex)
Finally
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try
この例では、関連付けられたエージェント ジョブとサブスクリプション メタデータをMSsubscription_propertiesに作成せずに、マージ パブリケーションへのプル サブスクリプション を作成します。 マージ エージェント ジョブの作成に使用される Windows アカウントの資格情報は、実行時に渡されます。
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;
try
{
// Connect to the Subscriber.
subscriberConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions.
publication = new MergePublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.LoadProperties())
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
// Define the pull subscription.
subscription = new MergePullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
// Specify that an agent job not be created for this subscription. The
// subscription can only be synchronized by running the Merge Agent directly.
// Subscripition metadata stored in MSsubscription_properties will not
// be available and must be specified at run time.
subscription.CreateSyncAgentByDefault = false;
// Create the pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (MergeSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName
&& existing.SubscriptionType == SubscriptionOption.Pull)
{
registered = true;
}
}
if (!registered)
{
// Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
MergeSubscriberType.Local, 0);
}
}
else
{
// Do something here if the publication does not exist.
throw new ApplicationException(String.Format(
"The publication '{0}' does not exist on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Implement the appropriate error handling here.
throw new ApplicationException(String.Format(
"The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
subscriberConn.Disconnect();
publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription
Try
' Connect to the Subscriber.
subscriberConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions.
publication = New MergePublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.LoadProperties() Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
' Define the pull subscription.
subscription = New MergePullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
' Specify that an agent job not be created for this subscription. The
' subscription can only be synchronized by running the Merge Agent directly.
' Subscripition metadata stored in MSsubscription_properties will not
' be available and must be specified at run time.
subscription.CreateSyncAgentByDefault = False
' Create the pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As MergeSubscription In _
publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName Then
registered = True
End If
Next
If Not registered Then
' Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
MergeSubscriberType.Local, 0)
End If
Else
' Do something here if the publication does not exist.
Throw New ApplicationException(String.Format( _
"The publication '{0}' does not exist on {1}.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Implement the appropriate error handling here.
Throw New ApplicationException(String.Format( _
"The subscription to {0} could not be created.", publicationName), ex)
Finally
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try
この例では、Web 同期を使用してインターネット経由で同期できるマージ パブリケーションへのプル サブスクリプションを作成します。 マージ エージェント ジョブの作成に使用される Windows アカウントの資格情報は、実行時に渡されます。 詳細については、「 Web 同期の構成」を参照してください。
// Define the Publisher, publication, and databases.
string publicationName = "AdvWorksSalesOrdersMerge";
string publisherName = publisherInstance;
string subscriberName = subscriberInstance;
string subscriptionDbName = "AdventureWorks2012Replica";
string publicationDbName = "AdventureWorks2012";
string hostname = @"adventure-works\garrett1";
string webSyncUrl = "https://" + publisherInstance + "/WebSync/replisapi.dll";
//Create connections to the Publisher and Subscriber.
ServerConnection subscriberConn = new ServerConnection(subscriberName);
ServerConnection publisherConn = new ServerConnection(publisherName);
// Create the objects that we need.
MergePublication publication;
MergePullSubscription subscription;
try
{
// Connect to the Subscriber.
subscriberConn.Connect();
// Ensure that the publication exists and that
// it supports pull subscriptions and Web synchronization.
publication = new MergePublication();
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
publication.ConnectionContext = publisherConn;
if (publication.LoadProperties())
{
if ((publication.Attributes & PublicationAttributes.AllowPull) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPull;
}
if ((publication.Attributes & PublicationAttributes.AllowWebSynchronization) == 0)
{
publication.Attributes |= PublicationAttributes.AllowWebSynchronization;
}
// Define the pull subscription.
subscription = new MergePullSubscription();
subscription.ConnectionContext = subscriberConn;
subscription.PublisherName = publisherName;
subscription.PublicationName = publicationName;
subscription.PublicationDBName = publicationDbName;
subscription.DatabaseName = subscriptionDbName;
subscription.HostName = hostname;
// Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin;
subscription.SynchronizationAgentProcessSecurity.Password = winPassword;
// Enable Web synchronization.
subscription.UseWebSynchronization = true;
subscription.InternetUrl = webSyncUrl;
// Specify the same Windows credentials to use when connecting to the
// Web server using HTTPS Basic Authentication.
subscription.InternetSecurityMode = AuthenticationMethod.BasicAuthentication;
subscription.InternetLogin = winLogin;
subscription.InternetPassword = winPassword;
// Ensure that we create a job for this subscription.
subscription.CreateSyncAgentByDefault = true;
// Create the pull subscription at the Subscriber.
subscription.Create();
Boolean registered = false;
// Verify that the subscription is not already registered.
foreach (MergeSubscription existing
in publication.EnumSubscriptions())
{
if (existing.SubscriberName == subscriberName
&& existing.SubscriptionDBName == subscriptionDbName
&& existing.SubscriptionType == SubscriptionOption.Pull)
{
registered = true;
}
}
if (!registered)
{
// Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown(
subscriberName, subscriptionDbName,
SubscriptionSyncType.Automatic,
MergeSubscriberType.Local, 0);
}
}
else
{
// Do something here if the publication does not exist.
throw new ApplicationException(String.Format(
"The publication '{0}' does not exist on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Implement the appropriate error handling here.
throw new ApplicationException(String.Format(
"The subscription to {0} could not be created.", publicationName), ex);
}
finally
{
subscriberConn.Disconnect();
publisherConn.Disconnect();
}
' Define the Publisher, publication, and databases.
Dim publicationName As String = "AdvWorksSalesOrdersMerge"
Dim publisherName As String = publisherInstance
Dim subscriberName As String = subscriberInstance
Dim subscriptionDbName As String = "AdventureWorks2012Replica"
Dim publicationDbName As String = "AdventureWorks2012"
Dim hostname As String = "adventure-works\garrett1"
Dim webSyncUrl As String = "https://" + publisherInstance + "/WebSync/replisapi.dll"
'Create connections to the Publisher and Subscriber.
Dim subscriberConn As ServerConnection = New ServerConnection(subscriberName)
Dim publisherConn As ServerConnection = New ServerConnection(publisherName)
' Create the objects that we need.
Dim publication As MergePublication
Dim subscription As MergePullSubscription
Try
' Connect to the Subscriber.
subscriberConn.Connect()
' Ensure that the publication exists and that
' it supports pull subscriptions and Web synchronization.
publication = New MergePublication()
publication.Name = publicationName
publication.DatabaseName = publicationDbName
publication.ConnectionContext = publisherConn
If publication.LoadProperties() Then
If (publication.Attributes And PublicationAttributes.AllowPull) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowPull
End If
If (publication.Attributes And PublicationAttributes.AllowWebSynchronization) = 0 Then
publication.Attributes = publication.Attributes _
Or PublicationAttributes.AllowWebSynchronization
End If
' Define the pull subscription.
subscription = New MergePullSubscription()
subscription.ConnectionContext = subscriberConn
subscription.PublisherName = publisherName
subscription.PublicationName = publicationName
subscription.PublicationDBName = publicationDbName
subscription.DatabaseName = subscriptionDbName
subscription.HostName = hostname
subscription.CreateSyncAgentByDefault = True
' Specify the Windows login credentials for the Merge Agent job.
subscription.SynchronizationAgentProcessSecurity.Login = winLogin
subscription.SynchronizationAgentProcessSecurity.Password = winPassword
' Enable Web synchronization.
subscription.UseWebSynchronization = True
subscription.InternetUrl = webSyncUrl
' Specify the same Windows credentials to use when connecting to the
' Web server using HTTPS Basic Authentication.
subscription.InternetSecurityMode = AuthenticationMethod.BasicAuthentication
subscription.InternetLogin = winLogin
subscription.InternetPassword = winPassword
' Create the pull subscription at the Subscriber.
subscription.Create()
Dim registered As Boolean = False
' Verify that the subscription is not already registered.
For Each existing As MergeSubscription In _
publication.EnumSubscriptions()
If existing.SubscriberName = subscriberName Then
registered = True
End If
Next
If Not registered Then
' Register the local subscription with the Publisher.
publication.MakePullSubscriptionWellKnown( _
subscriberName, subscriptionDbName, _
SubscriptionSyncType.Automatic, _
MergeSubscriberType.Local, 0)
End If
Else
' Do something here if the publication does not exist.
Throw New ApplicationException(String.Format( _
"The publication '{0}' does not exist on {1}.", _
publicationName, publisherName))
End If
Catch ex As Exception
' Implement the appropriate error handling here.
Throw New ApplicationException(String.Format( _
"The subscription to {0} could not be created.", publicationName), ex)
Finally
subscriberConn.Disconnect()
publisherConn.Disconnect()
End Try
こちらもご覧ください
レプリケーション管理オブジェクトの概念
プル サブスクリプションのプロパティの表示と変更
Web 同期の構成
パブリケーションを購読する
レプリケーション のセキュリティに関するベスト プラクティス