次の方法で共有


CREATE MESSAGE TYPE (Transact-SQL)

新しいメッセージ型を作成します。メッセージ型によって、メッセージの名前と、その名前を持つメッセージに対し Service Broker が実行する検証方法が定義されます。メッセージ交換の両側で、同じメッセージ型を定義する必要があります。

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

構文

CREATE MESSAGE TYPE message_type_name
    [ AUTHORIZATION owner_name ]
    [ VALIDATION = {  NONE
                    | EMPTY 
                    | WELL_FORMED_XML
                    | VALID_XML WITH SCHEMA COLLECTION 
                                                    schema_collection_name
                   } ]
[ ; ]

引数

  • message_type_name
    作成するメッセージ型の名前を指定します。新しいメッセージ型が現在のデータベースで作成され、AUTHORIZATION 句で指定されるプリンシパルによって所有されます。サーバー名、データベース名、スキーマ名は指定できません。message_type_name は 128 文字まで指定できます。

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

  • VALIDATION
    Service Broker によって、この型のメッセージの本文が検証される方法を指定します。この句を指定しない場合、検証は既定で NONE に設定されます。

  • NONE
    検証を実行しないことを指定します。メッセージの本文にはなんらかのデータが含まれているか、NULL の可能性があります。

  • EMPTY
    メッセージの本文は NULL にする必要があることを指定します。

  • WELL_FORMED_XML
    メッセージの本文に、整形式の XML が含まれている必要があることを指定します。

  • VALID_XML WITH SCHEMA COLLECTION schema_collection_name
    メッセージの本文に、指定されたスキーマ コレクション内のスキーマに準拠する XML が含まれている必要があることを指定します。schema_collection_name は、既存の XML スキーマ コレクションの名前にする必要があります。

説明

Service Broker では受信メッセージが検証されます。メッセージに、指定された検証の種類に準拠しないメッセージの本文が含まれている場合、Service Broker によって無効なメッセージが破棄され、メッセージを送信したサービスにエラー メッセージが返されます。

メッセージ交換の両側で、メッセージ型に同じ名前を定義する必要があります。Service Broker では、メッセージ交換の両側で同じ検証を使用する必要はありませんが、トラブルシューティングで役立つように、通常はメッセージ交換の両側でメッセージ型に同じ検証を指定します。

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

権限

メッセージ型を作成する権限は、既定では db_ddladmin 固定データベース ロールまたは db_owner 固定データベース ロールのメンバ、および sysadmin 固定サーバー ロールのメンバに与えられています。

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

CREATE MESSAGE TYPE ステートメントがスキーマ コレクションを指定する場合、ステートメントを実行するユーザーは、指定されているスキーマ コレクションに対する REFERENCES 権限が必要です。

A. 整形式の XML が含まれるメッセージ型を作成する

次の例では、整形式の XML が含まれる新しいメッセージ型を作成します。

  CREATE MESSAGE TYPE
    [//Adventure-Works.com/Expenses/SubmitExpense]
    VALIDATION = WELL_FORMED_XML ;   

B. 型指定された XML が含まれるメッセージ型を作成する

次の例では、XML でエンコードされた経費報告書に対するメッセージ型を作成します。この例では、単純な経費報告書に対するスキーマを保持する XML スキーマ コレクションを作成します。次に、スキーマに対するメッセージを検証する新しいメッセージ型を作成します。

CREATE XML SCHEMA COLLECTION ExpenseReportSchema AS
N'<?xml version="1.0" encoding="UTF-16" ?>
  <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
     targetNamespace="http://Adventure-Works.com/schemas/expenseReport"
     xmlns:expense="http://Adventure-Works.com/schemas/expenseReport"
     elementFormDefault="qualified"
   > 
    <xsd:complexType name="expenseReportType">
       <xsd:sequence>
         <xsd:element name="EmployeeName" type="xsd:string"/>
         <xsd:element name="EmployeeID" type="xsd:string"/>
         <xsd:element name="ItemDetail"
           type="expense:ItemDetailType" maxOccurs="unbounded"/>
      </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="ItemDetailType">
      <xsd:sequence>
        <xsd:element name="Date" type="xsd:date"/>
        <xsd:element name="CostCenter" type="xsd:string"/>
        <xsd:element name="Total" type="xsd:decimal"/>
        <xsd:element name="Currency" type="xsd:string"/>
        <xsd:element name="Description" type="xsd:string"/>
      </xsd:sequence>
    </xsd:complexType>

    <xsd:element name="ExpenseReport" type="expense:expenseReportType"/>

  </xsd:schema>' ;


  CREATE MESSAGE TYPE
    [//Adventure-Works.com/Expenses/SubmitExpense]
    VALIDATION = VALID_XML WITH SCHEMA COLLECTION ExpenseReportSchema ;

C. 空のメッセージに対するメッセージ型を作成する

次の例では、空のエンコードを使用して新しいメッセージ型を作成します。

 CREATE MESSAGE TYPE
     [//Adventure-Works.com/Expenses/SubmitExpense]
     VALIDATION = EMPTY ;

D. バイナリ データが含まれるメッセージ型を作成する

次の例では、バイナリ データが含まれる新しいメッセージ型を作成します。メッセージには XML 以外のデータが含まれるので、メッセージ型には NONE の検証型が指定されます。この場合、この型のメッセージを受信するアプリケーションで、メッセージにデータが含まれ、このデータが目的の型であることを確認する必要があります。

CREATE MESSAGE TYPE
    [//Adventure-Works.com/Expenses/ReceiptImage]
    VALIDATION = NONE ;