共用方式為


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
    將合約的擁有者設為指定的資料庫使用者或角色。當目前的使用者是 dbosa 時,owner_name 可以是任何有效使用者或角色的名稱。否則,owner_name 必須是目前使用者的名稱、具有 IMPERSONATE 權限之目前使用者的使用者名稱,或目前使用者所屬的角色名稱。當略過這個子句時,合約會屬於目前的使用者。

  • message_type_name
    這是要併入合約之訊息類型的名稱。

  • SENT BY
    指定哪一個端點可以傳送指定訊息類型的訊息。合約記錄服務可以用來進行特定交談的訊息。每一個交談有兩個端點:起始端端點,這是起始交談的服務,以及目標端點,這是起始端連絡的服務。

  • INITIATOR
    表示只有交談起始端可以傳送特定訊息類型的訊息。開始交談的服務稱為交談的「起始端」(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 的訊息類型時,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 提供之訊息類型的詳細資訊,請參閱<Broker 系統訊息>。

合約不能是暫存物件。您可以使用開頭是 # 的合約名稱,但它們是永久物件。

權限

根據預設,db_ddladmindb_owner 固定資料庫角色的成員,以及 系統管理員 (sysadmin) 固定伺服器角色的成員可以建立合約。

根據預設,合約的擁有者、db_ddladmindb_owner 固定資料庫角色的成員,以及系統管理員 (sysadmin) 固定伺服器角色的成員,具有合約的 REFERENCES 權限。

執行 CREATE CONTRACT 陳述式的使用者必須有所有指定訊息類型的 REFERENCES 權限。

範例

A. 建立合約

下列範例會依據三種訊息類型建立費用償還合約。

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