レプリケーション管理オブジェクトの概念

レプリケーション管理オブジェクト (RMO) は、SQL Server のレプリケーション機能をカプセル化するマネージ コード アセンブリです。RMO は Microsoft.SqlServer.Replication 名前空間により実装されます。

以下のセクションのトピックでは、レプリケーション タスクをプログラムから制御する場合の 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# プロジェクトを作成するには

  1. Visual Studio を起動します。

  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします。[新しいプロジェクト] ダイアログ ボックスが開きます。

  3. [プロジェクトの種類] ダイアログ ボックスで [Visual C# プロジェクト] を選択します。[テンプレート] ペインで [Windows アプリケーション] を選択します。

  4. (省略可) [名前] に、新しいアプリケーションの名前を入力します。

  5. [OK] をクリックして、Visual C# Windows テンプレートを読み込みます。

  6. [プロジェクト] メニューの [参照の追加] を選択します。[参照の追加] ダイアログ ボックスが表示されます。

  7. [.NET] タブの一覧から、次のアセンブリを選択して [OK] をクリックします。

    • Microsoft.SqlServer.Replication .NET プログラミング インターフェイス

    • Microsoft.SqlServer.ConnectionInfo

    • レプリケーション エージェント ライブラリ

    注意

    複数のファイルを選択するには、Ctrl キーを押しながら各ファイルをクリックします。

  8. (省略可) 手順 6. を繰り返します。[参照] タブをクリックして C:\Program Files\Microsoft SQL Server\100\COM に移動し、Microsoft.SqlServer.Replication.BusinessLogicSupport.dll を選択した後、[OK] をクリックします。

  9. [表示] メニューの [コード] をクリックします。

  10. コード内で、名前空間のステートメントの前に次の 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 プロジェクトを作成するには

  1. Visual Studio を起動します。

  2. [ファイル] メニューの [新しいプロジェクト] を選択します。[新しいプロジェクト] ダイアログ ボックスが開きます。

  3. [プロジェクトの種類] ペインで [Visual Basic] を選択します。[テンプレート] ペインで [Windows アプリケーション] を選択します。

  4. (省略可) [名前] ボックスに、新しいアプリケーションの名前を入力します。

  5. [OK] をクリックして、Visual Basic Windows テンプレートを読み込みます。

  6. [プロジェクト] メニューの [参照の追加] を選択します。[参照の追加] ダイアログ ボックスが表示されます。

  7. [.NET] タブの一覧から、次のアセンブリを選択して [OK] をクリックします。

    • Microsoft.SqlServer.Replication .NET プログラミング インターフェイス

    • Microsoft.SqlServer.ConnectionInfo

    • レプリケーション エージェント ライブラリ

    注意

    複数のファイルを選択するには、Ctrl キーを押しながら各ファイルをクリックします。

  8. (省略可) 手順 6. を繰り返します。[参照] タブをクリックして C:\Program Files\Microsoft SQL Server\100\COM に移動し、Microsoft.SqlServer.Replication.BusinessLogicSupport.dll を選択した後、[OK] をクリックします。

  9. [表示] メニューの [コード] をクリックします。

  10. コード内で、すべての宣言の前に次の 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 オブジェクトに渡されるか、オブジェクトの ConnectionContext プロパティに割り当てることで渡されます。この方法では、RMO プログラミング オブジェクトおよび接続オブジェクト インスタンスを別々に作成および管理することが可能となり、単一の接続オブジェクトを複数の RMO プログラミング オブジェクトと共に再利用することができます。レプリケーション サーバーへの接続には、次の規則が適用されます。

  • 指定された ServerConnection オブジェクトに、すべての接続プロパティを定義します。

  • 各 SQL Server インスタンスに対する接続に、それぞれ独自の ServerConnection オブジェクトが含まれている必要があります。

  • ServerConnection オブジェクトが、サーバー上で作成またはアクセスされる RMO プログラミング オブジェクトの ConnectionContext プロパティに割り当てられます。

  • Connect メソッドにより、サーバーへの接続が開かれます。接続を使用してサーバー上の RMO プログラミング オブジェクトにアクセスするメソッドを呼び出す前に、このメソッドを呼び出しておく必要があります。

  • RMO でも SMO (SQL Server 管理オブジェクト) でも、SQL Server への接続には ServerConnection クラスを使用するため、RMO オブジェクトと SMO オブジェクトの両方で同じ接続を使用できます。詳細については、「SQL Server のインスタンスへの接続」を参照してください。

  • 接続を作成し、サーバーに正常にログオンするための認証情報はすべて ServerConnection オブジェクトで指定されます。

  • 既定は Windows 認証です。SQL Server 認証を使用するには、LoginSecure を false に設定し、Login および Password に有効な SQL Server ログインおよびパスワードを設定する必要があります。セキュリティ資格情報は常にセキュリティ保護された状態で保存し、処理する必要があります。可能な限り、実行時に入力するようにします。

  • マルチスレッド化されたアプリケーションの場合、各スレッドで別々の ServerConnection オブジェクトを使用します。

RMO オブジェクトで使用された、アクティブなサーバー接続を閉じるには、ServerConnection オブジェクトに対して Disconnect メソッドを呼び出します。

RMO プロパティの設定

RMO プログラミング オブジェクトのプロパティは、サーバー上のこれらのレプリケーション オブジェクトのプロパティを表します。サーバー上に新しいレプリケーション オブジェクトを作成するとき、RMO プロパティを使用してこれらのオブジェクトを定義します。既存のオブジェクトの場合、RMO プロパティは既存のオブジェクトのプロパティを表しますが、変更できるのは書き込み可能または設定可能なプロパティのみです。プロパティは、新しいオブジェクトまたは既存のオブジェクトに設定できます。

新しいレプリケーション オブジェクトのプロパティの設定

サーバーに新しいレプリケーション オブジェクトを作成する際、必要なプロパティをすべて指定した後で、オブジェクトの Create メソッドを呼び出す必要があります。新しいレプリケーション オブジェクトのプロパティの設定の詳細については、「パブリッシングおよびディストリビューションを構成する方法 (RMO プログラミング)」を参照してください。

既存のレプリケーション オブジェクトのプロパティの設定

サーバー上に存在するレプリケーション オブジェクトの場合、RMO ではオブジェクトの種類に応じて、プロパティの一部またはすべてを変更することがサポートされます。書き込み可能または設定可能なプロパティのみを変更できます。プロパティを変更するには、Load または LoadProperties メソッドを呼び出して、サーバーから現在のプロパティを取得しておく必要があります。これらのメソッドを呼び出すことは、既存のオブジェクトが変更されることを表します。

既定では、オブジェクトのプロパティを変更するときに、使用される ServerConnection の実行モードに基づいてこれらの変更がサーバーにコミットされます。オブジェクトのプロパティを取得または変更する前に、IsExistingObject メソッドを使用して、そのオブジェクトがサーバー上に存在するかどうかを確認できます。レプリケーション オブジェクトのプロパティ変更の詳細については、「パブリッシャとディストリビュータのプロパティを表示および変更する方法 (RMO プログラミング)」を参照してください。

注意

複数の RMO クライアントまたは複数の RMO プログラミング オブジェクト インスタンスが、サーバー上の同じレプリケーション オブジェクトにアクセスする場合、RMO オブジェクトの Refresh メソッドを呼び出して、サーバー上のオブジェクトの現在の状態に基づいてプロパティを更新できます。

プロパティの変更のキャッシュ

SqlExecutionModes プロパティが CaptureSql に設定されている場合、RMO により生成されるすべての Transact-SQL ステートメントがキャプチャされ、いずれかの実行メソッドを使用して 1 つのバッチで手動で実行できます。RMO を使用するとプロパティの変更をキャッシュでき、オブジェクトの CommitPropertyChanges メソッドを使用して 1 つのバッチでまとめてコミットできます。プロパティの変更をキャッシュするには、オブジェクトの CachePropertyChanges プロパティを true に設定する必要があります。RMO におけるプロパティの変更がキャッシュされる場合でも、変更がいつサーバーに送られるのかは ServerConnection オブジェクトによって制御されます。レプリケーション オブジェクトのプロパティのキャッシュの詳細については、「パブリッシャとディストリビュータのプロパティを表示および変更する方法 (RMO プログラミング)」を参照してください。

重要な注意事項重要

ServerConnection クラスでは、プロパティを設定するときに明示的なトランザクションの宣言がサポートされますが、そのようなトランザクションでは内部的なレプリケーション トランザクションに干渉する場合があるため、予期しない結果が生じる可能性があります。RMO では使用しないでください。

この例では、プロパティ変更のキャッシュを示します。トランザクション パブリケーションの属性に加えられた変更は、明示的にサーバーに送られるまでキャッシュされます。

           // Define the server, database, and publication names
            string publisherName = publisherInstance;
            string publicationName = "AdvWorksProductTran";
            string publicationDbName = "AdventureWorks2008R2";

            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();
            }