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 個字元。
  • AUTHORIZATION owner_name
    將合約的擁有者設為指定的資料庫使用者或角色。當目前的使用者是 dbosa 時,owner_name 可以是任何有效使用者或角色的名稱。否則,owner_name 必須是目前使用者的名稱、具有 IMPERSONATE 權限之目前使用者的使用者名稱,或目前使用者所屬的角色名稱。當略過這個子句時,合約會屬於目前的使用者。
  • message_type_name
    這是要併入合約之訊息類型的名稱。
  • SENT BY
    指定哪一個端點可以傳送指定訊息類型的訊息。合約記錄服務可以用來進行特定交談的訊息。每一個交談有兩個端點:起始端端點,這是起始交談的服務,以及目標端點,這是起始端連絡的服務。
  • 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         
    ) ;

請參閱

參考

DROP CONTRACT (Transact-SQL)
EVENTDATA (Transact-SQL)

其他資源

合約
訊息類型
Service Broker 教學課程

說明及資訊

取得 SQL Server 2005 協助