Инструкция CREATE CONTRACT (Transact-SQL)

Применимо к:SQL Server Управляемый экземпляр SQL Azure

Создание нового контракта. Контракт определяет типы сообщений, используемые в диалогах компонента Service Broker, а также определяет, какой из участников диалога может посылать сообщения этого типа. Каждый диалог соответствует контракту. Инициирующая служба определяет контракт для диалога перед его началом. Целевая служба определяет контракты, диалоги для которых она принимает.

Соглашения о синтаксисе Transact-SQL

Синтаксис

  
CREATE CONTRACT contract_name  
   [ AUTHORIZATION owner_name ]  
      (  {   { message_type_name | [ DEFAULT ] }  
          SENT BY { INITIATOR | TARGET | ANY }   
       } [ ,...n] )   
[ ; ]  

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

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
Указывает на то, что только инициатор диалога может посылать сообщения определенного типа. Служба, которая начинает диалог, называется инициатором сеанса связи.

ЦЕЛЕВОЙ ОБЪЕКТ
Указывает на то, что только цель диалога может посылать сообщения определенного типа. Служба, которая принимает диалог, инициированный другой службой, называется целью диалога.

ЛЮБАЯ
Указывает на то, что сообщения этого типа могут посылаться как инициатором, так и целью.

[ 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 использует эти типы сообщений в системных сообщениях для приложения.

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

Разрешения

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

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

Пользователь, выполняющий инструкцию CREATE CONTRACT, должен обладать разрешением REFERENCES на все указанные типы сообщений.

Примеры

А. Создание контракта

В следующем примере создается контракт компенсации расходов, основанный на трех типах сообщений.

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)