CREATE CONTRACT (Transact-SQL)
新しいコントラクトを作成します。コントラクトは、Service Broker のメッセージ交換で使用されるメッセージ型を定義し、またメッセージ交換のどちら側がその型のメッセージを送信できるかを決定するものです。各メッセージ交換は、コントラクトに従います。発信側サービスでは、メッセージ交換の開始時に、そのメッセージ交換用のコントラクトを指定します。発信先サービスでは、メッセージ交換を受け入れるコントラクトを指定します。
構文
CREATE CONTRACT contract_name
[ AUTHORIZATION owner_name ]
( { { message_type_name | [ DEFAULT ] }
SENT BY { INITIATOR | TARGET | ANY }
} [ ,...n] )
[ ; ]
引数
contract_name
作成するコントラクトの名前を指定します。新しいコントラクトは現在のデータベースで作成され、AUTHORIZATION 句で指定するプリンシパルによって所有されます。サーバー名、データベース名、スキーマ名は指定できません。contract_name は 128 文字まで指定できます。注意 contract_name にキーワード ANY を使用するコントラクトは作成しないでください。CREATE BROKER PRIORITY でコントラクト名に ANY を指定した場合、優先度はすべてのコントラクトに適用されます。名前が ANY であるコントラクトに限定されません。
AUTHORIZATION owner_name
コントラクトの所有者を、指定したデータベース ユーザーまたはロールに設定します。現在のユーザーが dbo または sa の場合、owner_name には、任意の有効なユーザーまたはロールの名前を指定できます。それ以外の場合、owner_name には、現在のユーザーの名前、現在のユーザーが持つ借用権限に対応するユーザーの名前、または現在のユーザーが所属するロールの名前を指定する必要があります。この句を省略すると、コントラクトは現在のユーザーに属します。message_type_name
コントラクトの一部として含まれる、メッセージ型の名前を指定します。SENT BY
指定したメッセージ型のメッセージを送信できるエンドポイントを指定します。コントラクトには、サービスが特定のメッセージ交換で使用できるメッセージが記録されています。各メッセージ交換は、2 つのエンドポイントの間で行われます。1 つは発信側エンドポイントで、メッセージ交換を開始するサービスです。もう 1 つは発信先エンドポイントで、発信側のメッセージの送信先となるサービスです。INITIATOR
メッセージ交換の発信側だけが、指定したメッセージ型のメッセージを送信できることを示します。メッセージ交換を開始するサービスを、メッセージ交換の発信側といいます。TARGET
メッセージ交換の発信先だけが、指定したメッセージ型のメッセージを送信できることを示します。別のサービスによって開始されたメッセージ交換を受け入れるサービスを、メッセージ交換の発信先といいます。ANY
指定した型のメッセージを、発信側と発信先の両方から送信できることを示します。[ DEFAULT ]
コントラクトで、既定のメッセージ型のメッセージがサポートされることを示します。既定では、すべてのデータベースに DEFAULT というメッセージ型が含まれます。このメッセージ型では、NONE の検証が行われます。この句のコンテキストでは、DEFAULT はキーワードとして扱われないため、識別子として区切り記号で区切る必要があります。Microsoft SQL Server では、DEFAULT メッセージ型を指定する DEFAULT コントラクトも提供されています。
説明
コントラクトのメッセージ型の順序は重要ではありません。発信先が最初のメッセージを受信した後は、メッセージ交換の指定された側から、Service Broker を介して、許可されているメッセージをいつでも送信できるようになります。たとえば、メッセージ交換の発信側でメッセージ型 //Adventure-Works.com/Expenses/SubmitExpense が許可されている場合、この発信側は Service Broker を介して、メッセージ交換中に任意の数だけ SubmitExpense メッセージを送信できます。
コントラクトのメッセージ型と送信方向は変更できません。コントラクトの AUTHORIZATION を変更するには、ALTER AUTHORIZATION ステートメントを使用します。
コントラクトでは、発信側からのメッセージ送信が許可されている必要があります。コントラクトに、SENT BY ANY または SENT BY INITIATOR のメッセージ型のうち少なくとも 1 つが含まれていないと、CREATE CONTRACT ステートメントは失敗します。
コントラクトに関係なく、サービスでは常に、メッセージ型 **https://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer**、**https://schemas.microsoft.com/SQL/ServiceBroker/Error**、および https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog を受信できます。Service Broker では、アプリケーションへのシステム メッセージにこれらのメッセージ型が使用されます。ブローカで提供されるメッセージ型の詳細については、「Broker システム メッセージ」を参照してください。
コントラクトは一時オブジェクトとして指定できません。# で始まるコントラクト名は許可されますが、パーマネント オブジェクトになります。
権限
既定では、db_ddladmin 固定データベース ロールまたは db_owner 固定データベース ロールのメンバ、および sysadmin 固定サーバー ロールのメンバがコントラクトを作成できます。
コントラクトの REFERENCES 権限は、既定ではコントラクトの所有者、db_ddladmin 固定データベース ロールまたは db_owner 固定データベース ロールのメンバ、および sysadmin 固定サーバー ロールのメンバに与えられています。
CREATE CONTRACT ステートメントを実行するには、指定されているすべてのメッセージ型に対する REFERENCES 権限が必要です。
例
A. コントラクトを作成する
次の例では、3 つのメッセージ型に基づいて費用返済のコントラクトを作成します。
CREATE MESSAGE TYPE
[//Adventure-Works.com/Expenses/SubmitExpense]
VALIDATION = WELL_FORMED_XML ;
CREATE MESSAGE TYPE
[//Adventure-Works.com/Expenses/ExpenseApprovedOrDenied]
VALIDATION = WELL_FORMED_XML ;
CREATE MESSAGE TYPE
[//Adventure-Works.com/Expenses/ExpenseReimbursed]
VALIDATION= WELL_FORMED_XML ;
CREATE CONTRACT
[//Adventure-Works.com/Expenses/ExpenseSubmission]
( [//Adventure-Works.com/Expenses/SubmitExpense]
SENT BY INITIATOR,
[//Adventure-Works.com/Expenses/ExpenseApprovedOrDenied]
SENT BY TARGET,
[//Adventure-Works.com/Expenses/ExpenseReimbursed]
SENT BY TARGET
) ;