CREATE CONTRACT (Transact-SQL)
创建新约定。 约定定义了 Service Broker 会话中所用的消息类型,并且还定义了会话的哪一方可以发送该类型的消息。 每个会话都要遵循一个约定。 当会话开始时,启动服务为会话指定约定。 目标服务指定该目标服务将接受其会话的约定。
语法
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
将约定的所有者设置为指定的数据库用户或角色。 如果当前用户为 dbo 或 sa,则 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_ddladmin 或 db_owner 固定数据库角色的成员和 sysadmin 固定服务器角色的成员可以创建约定。
默认情况下,约定的所有者、db_ddladmin 或 db_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)