Replication Management Objects Concepts
適用対象: SQL Server Azure SQL Managed Instance
レプリケーション管理オブジェクト (RMO) は、SQL Server のレプリケーション機能をカプセル化するマネージド コード アセンブリです。 RMO は Microsoft.SqlServer.Replication 名前空間により実装されます。
以下のセクションのトピックでは、レプリケーション タスクをプログラムから制御する場合の RMO の使用方法について説明します。
[ディストリビューションの構成]
このセクションのトピックでは、RMO を使用してパブリッシングおよびディストリビューションを構成する方法について説明します。
パブリケーションを作成する
このセクションのトピックでは、RMO を使用してパブリケーションおよびアーティクルを作成、削除、および変更する方法について説明します。
Subscribe to Publications
このセクションのトピックでは、RMO を使用してサブスクリプションを作成、削除、および変更する方法について説明します。
レプリケーション トポロジのセキュリティ保護
このセクションのトピックでは、RMO を使用してセキュリティ設定を表示および変更する方法について説明します。
サブスクリプションの同期 (レプリケーション)
ここでは、サブスクリプションを同期する方法を説明します。
レプリケーションの監視
ここでは、プログラムからレプリケーション トポロジを監視する方法を説明します。
RMO プログラミングの概要
RMO は、SQL Server レプリケーションのすべての側面をプログラミングするために設計されています。 RMO 名前空間は Microsoft.SqlServer.Replicationされ、Microsoft .NET Framework アセンブリであるMicrosoft.SqlServer.Rmo.dllによって実装されます。 同様に Microsoft.SqlServer.Replication 名前空間に属している Microsoft.SqlServer.Replication.dll アセンブリにより、さまざまなレプリケーション エージェント (スナップショット エージェント、ディストリビューション エージェント、マージ エージェント) のプログラミングのためのマネージド コード インターフェイスが実装されます。 そのクラスには RMO からアクセスしてサブスクリプションを同期できます。 Microsoft.SqlServer.Replication.BusinessLogicSupport.dll アセンブリにより実装される、Microsoft.SqlServer.Replication.BusinessLogicSupport 名前空間のクラスを使用して、マージ レプリケーション用のカスタム ビジネス ロジックを作成できます。 このアセンブリは RMO から独立しています。
RMO に基づくアプリケーションの配置
RMO は、SQL Server Compact を除くすべてのバージョンの SQL Server に含まれるレプリケーション コンポーネントとクライアント接続コンポーネントに依存します。 RMO に基づいてアプリケーションをデプロイするには、レプリケーション コンポーネントとクライアント接続コンポーネントを含むバージョンの SQL Server を、アプリケーションを実行するコンピューターにインストールする必要があります。
RMO の概要
このセクションでは、Microsoft Visual Studio を使用して単純な RMO プロジェクトを開始する方法について説明します。
新しい Microsoft Visual C# プロジェクトを作成するには
Visual Studio を起動します。
[ File メニューの [ NewProject. ] をクリックします。[ 新しいプロジェクト ] ダイアログ ボックスが表示されます。
[プロジェクトの種類] ダイアログ ボックスで [Visual C# プロジェクト] を選択します。 [テンプレート] ウィンドウで [Windows アプリケーション] を選択します。
(省略可) [名前] に、新しいアプリケーションの名前を入力します。
[OK] をクリックして、Visual C# Windows テンプレートを読み込みます。
[プロジェクト] メニューの [参照の追加] 項目を選択します。 [参照の追加] ダイアログ ボックスが表示されます。
[.NET] タブの一覧から、次のアセンブリを選択して [OK] をクリックします。
Microsoft.SqlServer.Replication .NET プログラミング インターフェイス
Microsoft.SqlServer.ConnectionInfo
レプリケーション エージェント ライブラリ
Note
複数のファイルを選択するには、<localizedText>Ctrl</localizedText> キーを押しながら各ファイルをクリックします。
(省略可) 手順 6. を繰り返します。 [Browse タブをクリックし、C:\Program Files\Microsoft SQL Server\nnn\COM に移動し、Microsoft.SqlServer.Replication.BusinessLogicSupport.dllを選択して、[
OK をクリックします。[表示] メニューの [コード]をクリックします。
コード内で、名前空間のステートメントの前に次の using ステートメントを入力し、RMO 名前空間内の型を修飾します。
// These namespaces are required. using Microsoft.SqlServer.Replication; using Microsoft.SqlServer.Management.Common; // This namespace is only used when creating custom business // logic for merge replication. using Microsoft.SqlServer.Replication.BusinessLogicSupport;
新しい Microsoft Visual Basic .NET プロジェクトを作成するには
Visual Studio を起動します。
[ファイル] メニューの [新しいプロジェクト] を選択します。 [新しいプロジェクト] ダイアログ ボックスが表示されます。
[プロジェクトの種類] ウィンドウで [Visual Basic] を選択します。 [テンプレート] ウィンドウで [Windows アプリケーション] を選択します。
(省略可) [名前] ボックスに、新しいアプリケーションの名前を入力します。
[OK] をクリックして、Visual Basic Windows テンプレートを読み込みます。
[プロジェクト] メニューの [参照の追加] を選択します。 [参照の追加] ダイアログ ボックスが表示されます。
[.NET] タブの一覧から、次のアセンブリを選択して [OK] をクリックします。
Microsoft.SqlServer.Replication .NET プログラミング インターフェイス
Microsoft.SqlServer.ConnectionInfo
レプリケーション エージェント ライブラリ
Note
複数のファイルを選択するには、<localizedText>Ctrl</localizedText> キーを押しながら各ファイルをクリックします。
(省略可) 手順 6. を繰り返します。 [Browse タブをクリックし、C:\Program Files\Microsoft SQL Server\nnn\COM に移動し、Microsoft.SqlServer.Replication.BusinessLogicSupport.dllを選択して、[
OK をクリックします。[表示] メニューの [コード]をクリックします。
コードでは、宣言の前に、次の Imports ステートメントを入力し、RMO 名前空間の型を修飾します。
' These namespaces are required. Imports Microsoft.SqlServer.Replication Imports Microsoft.SqlServer.Management.Common ' This namespace is only used when creating custom business ' logic for merge replication. Imports Microsoft.SqlServer.Replication.BusinessLogicSupport
レプリケーション サーバーへの接続
RMO プログラミング オブジェクトでは、 ServerConnection クラスのインスタンスを使用して SQL Server のインスタンスへの接続を確立する必要があります。 サーバーへの接続は、RMO プログラミング オブジェクトとは別に作成されます。 接続はインスタンスの作成中に RMO オブジェクトに渡されるか、オブジェクトの P:Microsoft.SqlServer.Replication.ReplicationObject.ConnectionContex
t プロパティに割り当てることで渡されます。 この方法では、RMO プログラミング オブジェクトおよび接続オブジェクト インスタンスを別々に作成および管理することが可能となり、単一の接続オブジェクトを複数の RMO プログラミング オブジェクトと共に再利用することができます。 レプリケーション サーバーへの接続には、次の規則が適用されます。
指定された ServerConnection オブジェクトに、すべての接続プロパティを定義します。
SQL Server の各インスタンスへの接続には、独自の ServerConnection オブジェクトが必要です。
ServerConnection オブジェクトが、サーバー上で作成またはアクセスされる RMO プログラミング オブジェクトの
P:Microsoft.SqlServer.Replication.ReplicationObject.ConnectionContext
プロパティに割り当てられます。Connect メソッドにより、サーバーへの接続が開かれます。 接続を使用してサーバー上の RMO プログラミング オブジェクトにアクセスするメソッドを呼び出す前に、このメソッドを呼び出しておく必要があります。
RMO と SQL Server 管理オブジェクト (SMO) はどちらも SQL Server への接続に ServerConnection クラスを使用するため、RMO オブジェクトと SMO オブジェクトの両方で同じ接続を使用できます。 詳細については、「SQL Server のインスタンスへの接続」を参照してください。
接続を作成し、サーバーに正常にログオンするための認証情報はすべて ServerConnection オブジェクトで指定されます。
既定は Windows 認証です。 SQL Server 認証を使用するには、LoginSecureを false に設定しLoginし、Passwordを有効な SQL Server ログオンとパスワードに設定する必要があります。 セキュリティ資格情報は常にセキュリティ保護された状態で保存し、処理する必要があります。可能な限り、実行時に入力するようにします。
マルチスレッド化されたアプリケーションの場合、各スレッドで別々の ServerConnection オブジェクトを使用します。
RMO オブジェクトで使用された、アクティブなサーバー接続を閉じるには、Disconnect オブジェクトに対して ServerConnection メソッドを呼び出します。
RMO プロパティの設定
RMO プログラミング オブジェクトのプロパティは、サーバー上のこれらのレプリケーション オブジェクトのプロパティを表します。 サーバー上に新しいレプリケーション オブジェクトを作成するとき、RMO プロパティを使用してこれらのオブジェクトを定義します。 既存のオブジェクトの場合、RMO プロパティは既存のオブジェクトのプロパティを表しますが、変更できるのは書き込み可能または設定可能なプロパティのみです。 プロパティは、新しいオブジェクトまたは既存のオブジェクトに設定できます。
新しいレプリケーション オブジェクトのプロパティの設定
サーバーに新しいレプリケーション オブジェクトを作成する際、必要なプロパティをすべて指定した後で、オブジェクトの Create メソッドを呼び出す必要があります。 新しいレプリケーション オブジェクトのプロパティの設定の詳細については、「Configure Publishing and Distribution」 (パブリッシングとディストリビューションの構成) を参照してください。
既存のレプリケーション オブジェクトのプロパティの設定
サーバー上に存在するレプリケーション オブジェクトの場合、RMO ではオブジェクトの種類に応じて、プロパティの一部またはすべてを変更することがサポートされます。 書き込み可能または設定可能なプロパティのみを変更できます。 プロパティを変更するには、Load または M:Microsoft.SqlServer.Replication.ReplicationObject.LoadProperties
メソッドを呼び出して、サーバーから現在のプロパティを取得しておく必要があります。 これらのメソッドを呼び出すことは、既存のオブジェクトが変更されることを表します。
既定では、オブジェクトのプロパティを変更するときに、使用される ServerConnection の実行モードに基づいてこれらの変更がサーバーにコミットされます。 オブジェクトのプロパティを取得または変更する前に、P:Microsoft.SqlServer.Replication.ReplicationObject.IsExistingObject
メソッドを使用して、そのオブジェクトがサーバー上に存在するかどうかを確認できます。 レプリケーション オブジェクトのプロパティの変更方法の詳細については、「ディストリビューターとパブリッシャーのプロパティの表示および変更」を参照してください。
Note
複数の RMO クライアントまたは複数の RMO プログラミング オブジェクト インスタンスが、サーバー上の同じレプリケーション オブジェクトにアクセスする場合、RMO オブジェクトの Refresh メソッドを呼び出して、サーバー上のオブジェクトの現在の状態に基づいてプロパティを更新できます。
プロパティの変更のキャッシュ
SqlExecutionModes プロパティがCaptureSqlに設定されている場合、RMO によって生成されたすべての Transact-SQL ステートメントがキャプチャされ、いずれかの実行メソッドを使用して 1 つのバッチで手動で実行できるようになります。 RMO を使用するとプロパティの変更をキャッシュでき、オブジェクトの M:Microsoft.SqlServer.Replication.ReplicationObject.CommitPropertyChanges
メソッドを使用して 1 つのバッチでまとめてコミットできます。 プロパティの変更をキャッシュするには、オブジェクトの P:Microsoft.SqlServer.Replication.ReplicationObject.CachePropertyChanges
プロパティを true に設定する必要があります。 RMO におけるプロパティの変更がキャッシュされる場合でも、変更がいつサーバーに送られるのかは ServerConnection オブジェクトによって制御されます。 レプリケーション オブジェクトのプロパティのキャッシュの詳細については、「ディストリビューターとパブリッシャーのプロパティの表示および変更」を参照してください。
重要
ServerConnection クラスでは、プロパティを設定するときに明示的なトランザクションの宣言がサポートされますが、そのようなトランザクションでは内部的なレプリケーション トランザクションに干渉する場合があるため、予期しない結果が生じる可能性があります。RMO では使用しないでください。
RMO コンポーネントの TLS 1.2 サポートの有効化
Windows 2012 以下の場合、RMO コンポーネントの TLS1.2 サポートは、更新プログラム KB 3140245 をインストールし、記事の説明に従ってレジストリ キーを作成することで有効にすることができます。 Windows 2012 R2 以降のバージョンの場合は、上記の記事に示されているレジストリ キーのみを作成する必要があります。
例
この例では、プロパティ変更のキャッシュを示します。 トランザクション パブリケーションの属性に加えられた変更は、明示的にサーバーに送られるまでキャッシュされます。
// Define the server, database, and publication names
string publisherName = publisherInstance;
string publicationName = "AdvWorksProductTran";
string publicationDbName = "AdventureWorks2022";
TransPublication publication;
// Create a connection to the Publisher.
ServerConnection conn = new ServerConnection(publisherName);
try
{
// Connect to the Publisher.
conn.Connect();
// Set the required properties for the publication.
publication = new TransPublication();
publication.ConnectionContext = conn;
publication.Name = publicationName;
publication.DatabaseName = publicationDbName;
// Explicitly enable caching of property changes on this object.
publication.CachePropertyChanges = true;
// If we can't get the properties for this publication,
// throw an application exception.
if (publication.LoadProperties())
{
// Enable support for push subscriptions and disable support
// for pull subscriptions.
if ((publication.Attributes & PublicationAttributes.AllowPull) != 0)
{
publication.Attributes ^= PublicationAttributes.AllowPull;
}
if ((publication.Attributes & PublicationAttributes.AllowPush) == 0)
{
publication.Attributes |= PublicationAttributes.AllowPush;
}
// Send changes to the server.
publication.CommitPropertyChanges();
}
else
{
throw new ApplicationException(String.Format(
"Settings could not be retrieved for the publication. " +
"Ensure that the publication {0} exists on {1}.",
publicationName, publisherName));
}
}
catch (Exception ex)
{
// Do error handling here.
throw new ApplicationException(
"The publication property could not be changed.", ex);
}
finally
{
conn.Disconnect();
}