次の方法で共有


レッスン 2: イニシエーター データベースを作成する

適用対象:SQL ServerAzure SQL Managed Instance

このレッスンでは、イニシエーター データベースと、このチュートリアルで使用されるすべてのイニシエーター Service Broker オブジェクトを作成する方法について説明します。 これらの手順は、データベース エンジンの発信側インスタンスと同じコンピューターで実行されている Management Studio のコピーから実行してください。

手順

Service Broker エンドポイントの作成

  • 次のコードをコピーしてクエリ エディター ウィンドウに貼り付け、それを実行して、データベース エンジンのこのインスタンスの Service Broker エンドポイントを作成します。 Service Broker エンドポイントは、Service Broker メッセージが送信されるネットワーク アドレスを指定します。 このエンドポイントは、Service Broker の既定の TCP ポート 4022 を使用し、データベース エンジンのリモート インスタンスが Windows 認証接続を使用してメッセージを送信することを指定します。

    Windows 認証は、両方のコンピューターが同じドメイン内にあるか、信頼されたドメインにある場合に機能します。 コンピューターが信頼されたドメインにない場合は、エンドポイントに証明書セキュリティを使用します。 詳細については、「 方法: Service Broker トランスポート セキュリティ用の証明書を作成する」を参照してください。

    USE master;
    GO
    
    IF EXISTS (SELECT *
               FROM sys.endpoints
               WHERE name = N'InstInitiatorEndpoint')
        DROP ENDPOINT InstInitiatorEndpoint;
    GO
    
    CREATE ENDPOINT InstInitiatorEndpoint
        STATE = STARTED
        AS TCP
    (
                LISTENER_PORT = 4022
    )
        FOR SERVICE_BROKER
    (
                AUTHENTICATION = WINDOWS
    );
    GO
    

発信側データベース、マスター キー、およびユーザーの作成

  • 次のコードをコピーし、クエリ エディター ウィンドウに貼り付けます。 CREATE MASTER KEY ステートメントのパスワードを変更し、コードを実行して、このチュートリアルで使用するターゲット データベースを作成します。 既定では、新しいデータベースには ENABLE_BROKER オプションがオンに設定されています。 このコードは、暗号化およびリモート接続をサポートするために使用されるマスター キーとユーザーも作成します。

    USE master;
    GO
    
    IF EXISTS (SELECT *
               FROM sys.databases
               WHERE name = N'InstInitiatorDB')
        DROP DATABASE InstInitiatorDB;
    GO
    
    CREATE DATABASE InstInitiatorDB;
    GO
    
    USE InstInitiatorDB;
    GO
    
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = N'<EnterStrongPassword2Here>';
    GO
    
    CREATE USER InitiatorUser WITHOUT LOGIN;
    GO
    

発信側証明書の作成

  • 次のコードをコピーし、クエリ エディター ウィンドウに貼り付けます。 BACKUP CERTIFICATE ステートメントで指定されているファイル名を変更して、システム上のフォルダーを参照します。 次に、コードを実行して、メッセージの暗号化に使用されるイニシエーター証明書を作成します。 指定したフォルダーには、自分の Windows アカウント、およびデータベース エンジンのインスタンスが実行されている Windows アカウント以外のアカウントからのアクセスを防ぐアクセス許可が設定されている必要があります。 レッスン 3 では、発信先インスタンスからアクセス可能なフォルダーに InstInitiatorCertificate.cer ファイルを手動でコピーする必要があります。

    CREATE CERTIFICATE InstInitiatorCertificate
        AUTHORIZATION InitiatorUser
        WITH SUBJECT = N'Initiator Certificate',
            EXPIRY_DATE = N'12/31/2010';
    
    BACKUP CERTIFICATE InstInitiatorCertificate
        TO FILE = N'C:\storedcerts\$ampleSSBCerts\InstInitiatorCertificate.cer';
    GO
    

メッセージ型の作成

  • 次のコードをコピーしてクエリ エディター ウィンドウに貼り付け、それを実行して会話のメッセージの種類を作成します。 ここで指定するメッセージの種類の名前とプロパティは、前のレッスンの InstTargetDB で作成されたものと同じである必要があります。

    CREATE MESSAGE TYPE [//BothDB/2InstSample/RequestMessage]
        VALIDATION = WELL_FORMED_XML;
    
    CREATE MESSAGE TYPE [//BothDB/2InstSample/ReplyMessage]
        VALIDATION = WELL_FORMED_XML;
    GO
    

コントラクトの作成

  • 次のコードをコピーしてクエリ エディター ウィンドウに貼り付け、それを実行して会話のコントラクトを作成します。 ここで指定するコントラクト名とプロパティは、次のレッスンで InstInitiatorDB で作成するコントラクトと同じである必要があります。

    CREATE CONTRACT [//BothDB/2InstSample/SimpleContract]
        ([//BothDB/2InstSample/RequestMessage] SENT BY INITIATOR,
        [//BothDB/2InstSample/ReplyMessage] SENT BY TARGET);
    GO
    

発信側のキューおよびサービスの作成

  • 次のコードをコピーしてクエリ エディター ウィンドウに貼り付け、それを実行して、ターゲットに使用されるキューとサービスを作成します。 CREATE SERVICE ステートメントは、サービスを InstInitiatorQueue に関連付けます。 したがって、サービスに送信されたすべてのメッセージは、InstInitiatorQueue で受信されます。 また、この CREATE SERVICE では、先ほど作成した BothDB/ 2InstSample/SimpleContract を使用する会話のみが、ターゲット サービスとしてサービスを使用できることを指定します。

    CREATE QUEUE InstInitiatorQueue;
    
    CREATE SERVICE [//InstDB/2InstSample/InitiatorService]
        AUTHORIZATION InitiatorUser
        ON QUEUE InstInitiatorQueue;
    GO
    

発信先オブジェクトへの参照の作成

  • 次のコードをコピーし、クエリ エディター ウィンドウに貼り付けます。 FROM FILE句を変更して、レッスン 1 の手順 3 でInstTargetCertificate.cer ファイルをコピーしたフォルダーを参照します。 次にコードを実行し、発信先ユーザーを作成して発信先証明書を取り込みます。

    CREATE USER TargetUser WITHOUT LOGIN;
    
    CREATE CERTIFICATE InstTargetCertificate
        AUTHORIZATION TargetUser
        FROM FILE = N'C:\storedcerts\$ampleSSBCerts\InstTargetCertificate.cer';
    GO
    

ルートを作成する

  • 次のコードをコピーし、クエリ エディター ウィンドウに貼り付けます。 文字列 MyTargetComputer を、発信先インスタンスを実行しているコンピューターの名前に変更します。 次にコードを実行し、発信先サービスおよび発信側サービスへのルートと、TargetUser を発信先サービス ルートに関連付けるリモート サービス バインドを作成します。

    次の CREATE ROUTE ステートメントは、ターゲット インスタンスに重複するサービス名がないことを前提としています。 ターゲット インスタンス上の複数のデータベースに同じ名前のサービスがある場合は、 BROKER_INSTANCE 句を使用して、会話を開くデータベースを指定します。

    DECLARE @Cmd AS NVARCHAR (4000);
    
    SET @Cmd = N'USE InstInitiatorDB;
                 CREATE ROUTE InstTargetRoute
                 WITH SERVICE_NAME =
                     N''//TgtDB/2InstSample/TargetService'',
                     ADDRESS = N''TCP://MyTargetComputer:4022'';';
    
    EXECUTE (@Cmd);
    
    SET @Cmd = N'USE msdb
                 CREATE ROUTE InstInitiatorRoute
                 WITH SERVICE_NAME =
                     N''//InstDB/2InstSample/InitiatorService'',
                     ADDRESS = N''LOCAL''';
    
    EXECUTE (@Cmd);
    GO
    
    CREATE REMOTE SERVICE BINDING TargetBinding
        TO SERVICE N'//TgtDB/2InstSample/TargetService'
        WITH USER = TargetUser;
    GO
    

次のステップ

これで、このチュートリアル用のイニシエーター データベースが正常に作成されました。 次に、イニシエーター オブジェクトに依存するターゲット オブジェクトを作成して、ターゲット データベースの構成を完了します。