CREATE CONTRACT (Transact-SQL)

新しいコントラクトを作成します。コントラクトは、Service Broker のメッセージ交換で使用されるメッセージ型を定義し、またメッセージ交換のどちら側がその型のメッセージを送信できるかを決定するものです。各メッセージ交換は、コントラクトに従います。発信側サービスでは、メッセージ交換の開始時に、そのメッセージ交換用のコントラクトを指定します。発信先サービスでは、メッセージ交換を受け入れるコントラクトを指定します。

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

構文

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