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 个字符。

    注意注意

    不要创建将关键字 ANY 用于 contract_name 的约定。在 CREATE BROKER PRIORITY 中为约定名称指定 ANY 时,优先级将被视为针对所有约定。此情况不限于名称为 ANY 的约定。

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