CREATE SERVICE (Transact-SQL)

新しいサービスを作成します。Service Broker サービスとは、特定のタスクまたはタスク セットの名前です。Service Broker ではサービスの名前を使用して、メッセージのルーティング、データベース内の正しいキューへのメッセージの配信、メッセージ交換のコントラクトの適用を行います。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

CREATE SERVICE service_name
   [ AUTHORIZATION owner_name ]
   ON QUEUE [ schema_name. ]queue_name
   [ ( contract_name | [DEFAULT][ ,...n ] ) ]
[ ; ]

引数

  • service_name
    作成するサービスの名前を指定します。新しいサービスは現在のデータベースで作成され、AUTHORIZATION 句で指定されるプリンシパルによって所有されます。サーバー名、データベース名、スキーマ名は指定できません。service_name は、有効な sysname データ型で指定する必要があります。

    注意注意

    service_name にキーワード ANY を使用するサービスは作成しないでください。CREATE BROKER PRIORITY でサービス名に ANY を指定した場合、優先度はすべてのサービスに適用されます。名前が ANY であるサービスに限定されません。

  • AUTHORIZATION owner_name
    サービスの所有者を、指定したデータベース ユーザーまたはロールに設定します。現在のユーザーが dbo または sa の場合、owner_name には、任意の有効なユーザーまたはロールの名前を指定できます。それ以外の場合、owner_name には、現在のユーザーの名前、現在のユーザーの IMPERSONATE 権限に対応するユーザーの名前、または現在のユーザーが所属するロールの名前を指定する必要があります。

  • ON QUEUE [ schema_name**.**] queue_name
    サービス用のメッセージを受信するキューを指定します。キューはサービスと同じデータベース内に存在する必要があります。schema_name を指定しない場合は、ステートメントを実行するユーザーに既定のスキーマが使用されます。

  • contract_name
    このサービスのコントラクトを指定します。サービス プログラムでは、指定したコントラクトを使用して、サービスに対するメッセージ交換が開始されます。コントラクトを指定しない場合、サービスではメッセージ交換が開始されるだけです。

  • [DEFAULT]
    サービスは、DEFAULT コントラクトに従ったメッセージ交換の発信先となります。この句のコンテキストでは、DEFAULT はキーワードとして扱われないため、識別子として区切り記号で区切る必要があります。DEFAULT コントラクトでは、メッセージ交換の両側で DEFAULT メッセージ型のメッセージを送信できます。DEFAULT メッセージ型では、検証は NONE となります。

説明

各サービスでは、関連付けられているコントラクトで提供される機能が、他のサービスでも使用できるよう公開されます。CREATE SERVICE ステートメントでは、サービスに対するコントラクトを指定できます。サービスは、指定されたコントラクトを使用するメッセージ交換の発信先となります。コントラクトを指定しないサービスの機能は、他のサービスに公開されません。

サービスで開始されるメッセージ交換では、任意のコントラクトを使用できます。サービスでメッセージ交換を開始するだけの場合は、コントラクトを指定しないでサービスを作成できます。

Service Broker でリモート サービスからの新しいメッセージ交換を受け入れるときには、発信先サービスの名前を基に、メッセージ交換のメッセージを格納するキューが決まります。

権限

サービスを作成する権限は、既定では db_ddladmin 固定データベース ロールまたは db_owner 固定データベース ロールのメンバ、および sysadmin 固定サーバー ロールのメンバに与えられています。CREATE SERVICE ステートメントを実行するには、指定したキューとすべてのコントラクトに対して REFERENCES 権限が必要です。

サービスに対する REFERENCES 権限は、既定ではサービスの所有者、db_ddladmin 固定データベース ロールまたは db_owner 固定データベース ロールのメンバ、および sysadmin 固定サーバー ロールのメンバに与えられています。サービスに対する SEND 権限は、既定ではサービスの所有者、db_owner 固定データベース ロールのメンバ、および sysadmin 固定サーバー ロールのメンバに与えられています。

サービスは一時オブジェクトとして指定できません。# で始まるサービス名は許可されますが、パーマネント オブジェクトになります。

A. 1 つのコントラクトでサービスを作成する

次の例では、dbo スキーマの ExpenseQueue キューにサービス //Adventure-Works.com/Expenses を作成します。このサービスを対象とするダイアログは、コントラクト //Adventure-Works.com/Expenses/ExpenseSubmission に従う必要があります。

CREATE SERVICE [//Adventure-Works.com/Expenses]
    ON QUEUE [dbo].[ExpenseQueue]
    ([//Adventure-Works.com/Expenses/ExpenseSubmission]) ;

B. 複数のコントラクトでサービスを作成する

次の例では、ExpenseQueue キューにサービス //Adventure-Works.com/Expenses を作成します。このサービスを対象とするダイアログは、コントラクト //Adventure-Works.com/Expenses/ExpenseSubmission またはコントラクト //Adventure-Works.com/Expenses/ExpenseProcessing に従う必要があります。

CREATE SERVICE [//Adventure-Works.com/Expenses] ON QUEUE ExpenseQueue
    ([//Adventure-Works.com/Expenses/ExpenseSubmission],
     [//Adventure-Works.com/Expenses/ExpenseProcessing]) ;

C. コントラクトなしでサービスを作成する

次の例では、サービス //Adventure-Works.com/Expenses を ExpenseQueue キュー上に作成します。このサービスにはコントラクト情報はありません。したがって、このサービスはダイアログの開始だけを行えます。

CREATE SERVICE [//Adventure-Works.com/Expenses] ON QUEUE ExpenseQueue ;