Поделиться через


Инструкция 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. При указании ключевого слова ANY для имени контракта в инструкции CREATE BROKER PRIORITY приоритет применяется ко всем контрактам. Его применение не ограничивается контрактом с именем ANY.

  • 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 на контракт обладают владелец контракта, члены предопределенных ролей ddl_admin или db_ddladmin базы данных и члены предопределенной роли сервера 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         
    ) ;