CREATE MESSAGE TYPE (Transact-SQL)

適用于:SQL ServerAzure SQL 受控執行個體

建立新的訊息類型。 訊息類型會定義訊息的名稱,以及 Service Broker 在該名稱的訊息上執行的驗證。 交談的兩端必須定義相同的訊息類型。

Transact-SQL 語法慣例

Syntax

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

注意

若要檢視 SQL Server 2014 與更早版本的 Transact-SQL 語法,請參閱舊版文件

引數

message_type_name
這是要建立的訊息類型名稱。 新訊息類型會建立在目前的資料庫中,擁有者是 AUTHORIZATION 子句中所指定的主體。 您不可指定伺服器、資料庫和結構描述名稱。 message_type_name 最多可有 128 個字元。

AUTHORIZATION owner_name
將訊息類型的擁有者設為指定的資料庫使用者或角色。 當目前的使用者是 dbosa 時,owner_name 可以是任何有效使用者或角色的名稱。 否則,owner_name 必須是目前使用者的名稱、目前使用者有其 IMPERSONATE 權限的使用者名稱,或目前使用者所屬的角色名稱。 當略過這個子句時,訊息類型會屬於目前的使用者。

VALIDATION
指定 Service Broker 如何驗證此類型訊息的訊息本文。 當沒有指定這個子句時,驗證的預設值便是 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_ddladmindb_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="https://Adventure-Works.com/schemas/expenseReport"  
     xmlns:expense="https://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 ;  

另請參閱

ALTER MESSAGE TYPE (Transact-SQL)
DROP MESSAGE TYPE (Transact-SQL)
EVENTDATA (Transact-SQL)