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
    Устанавливает в качестве владельца контракта определенного пользователя или роль базы данных. Если текущий пользователь является членом роли dbo или sa, то аргумент owner_name может быть именем любого допустимого пользователя или роли. В противном случае аргумент owner_name должен быть именем текущего пользователя, именем пользователя, на олицетворение которого текущий пользователь имеет разрешения, или именем роли, которой принадлежит текущий пользователь. Если это предложение опущено, контракт принадлежит текущему пользователю.
  • 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.

Необходимо, чтобы контракт позволял инициатору посылать сообщения. Инструкция CREATE CONTRACT завершается сбоем, если в контракте не содержится ни одного сообщения типа SENT BY ANY или SENT BY INITIATOR.

Независимо от контракта, служба всегда может принимать сообщения типа https://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer, https://schemas.microsoft.com/SQL/ServiceBroker/Error и https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog. Service Broker использует эти типы сообщений для передачи системных сообщений приложению. Дополнительные сведения о типах сообщений, предоставляемых брокером, см. в разделе Сообщения компонента Service Broker.

Контракт может не быть временным объектом. Имена контрактов, начинающихся с символа #, разрешены, но являются постоянными объектами.

Разрешения

По умолчанию члены фиксированных ролей db_ddladmin или db_owner базы данных и члены фиксированной серверной роли sysadmin могут создавать контракты.

По умолчанию разрешением REFERENCES на контракт обладают владелец контракта, члены фиксированных ролей db_ddladmin или db_owner базы данных и члены фиксированной серверной роли sysadmin.

Пользователь, выполняющий инструкцию 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