CREATE SERVICE (Transact-SQL)
適用対象: SQL Server Azure SQL Managed Instance
新しいサービスを作成します。 Service Broker サービスとは、特定のタスクまたはタスク セットの名前です。 Service Broker ではサービスの名前を使用して、メッセージのルーティング、データベース内の正しいキューへのメッセージの配信、メッセージ交換のコントラクトの適用を行います。
構文
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. 複数のコントラクトでサービスを作成する
次の例では、//Adventure-Works.com/Expenses
キューにサービス ExpenseQueue
を作成します。 このサービスを対象とするダイアログは、コントラクト //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 on the ExpenseQueue
キューを作成します。 このサービスにはコントラクト情報はありません。 したがって、このサービスはダイアログの開始だけを行えます。
CREATE SERVICE [//Adventure-Works.com/Expenses] ON QUEUE ExpenseQueue ;
参照
ALTER SERVICE (Transact-SQL)
DROP SERVICE (Transact-SQL)
EVENTDATA (Transact-SQL)