CREATE CONTRACT (Transact-SQL)

Cria um novo contrato. Um contrato define os tipos de mensagem que são usados em uma conversação do Service Broker e também determina qual lado da conversação pode enviar mensagens daquele tipo. Cada conversação segue um contrato. O serviço iniciador especifica o contrato para a conversação quando esta inicia. O serviço de destino especifica os contratos para os quais o serviço de destino aceita conversações.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

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

Argumentos

  • contract_name
    É o nome do contrato a ser criado. Um novo contrato é criado no banco de dados atual e é de propriedade da entidade especificada na cláusula AUTHORIZATION. Os nomes de servidor, banco de dados e esquema não podem ser especificados. O contract_name pode conter até 128 caracteres.

    ObservaçãoObservação

    Não crie um contrato que usa a palavra-chave ANY para o contract_name. Quando você especifica ANY para um nome de serviço em CREATE BROKER PRIORITY, a prioridade é considerada para todos os contratos. Ela não fica limitada a um contrato cujo nome é ANY.

  • AUTHORIZATION owner_name
    Define o proprietário do contrato para o usuário ou a função de banco de dados especificada. Quando o usuário atual for dbo ou sa, owner_name poderá ser o nome de qualquer usuário ou função válida. Caso contrário, o owner_name deverá ser o nome do usuário atual, o nome de um usuário para o qual o usuário atual tem permissões de representação ou o nome de uma função à qual o usuário atual pertence. Quando esta cláusula é omitida, o contrato pertence ao usuário atual.

  • message_type_name
    É o nome de um tipo de mensagem a ser incluído como parte do contrato.

  • SENT BY
    Especifica qual ponto de extremidade pode enviar uma mensagem do tipo indicado. Os contratos documentam as mensagens que os serviços podem usar para ter conversações específicas. Cada conversação possui dois pontos de extremidade: o ponto iniciador, o serviço que iniciou a conversação, e o ponto de destino, o serviço que o iniciador está contatando.

  • INITIATOR
    Indica que somente o iniciador da conversação pode enviar mensagens do tipo especificado. Um serviço que inicia uma conversação é chamado de iniciador da conversação.

  • TARGET
    Indica que somente o destino da conversação pode enviar mensagens do tipo especificado. Um serviço que aceita uma conversação iniciada por outro serviço é chamado de destino da conversação.

  • ANY
    Indica que as mensagens deste tipo podem ser enviadas pelo iniciador e pelo destino.

  • [ DEFAULT ]
    Indica que este contrato dá suporte a mensagens do tipo padrão. Por padrão, todos os bancos de dados contêm um tipo de mensagem denominado DEFAULT. Esse tipo de mensagem usa uma validação de NONE. No contexto desta cláusula, DEFAULT não é uma palavra-chave e deve ser delimitado como um identificador. O Microsoft SQL Server também fornece um contrato DEFAULT que especifica o tipo de mensagem DEFAULT.

Comentários

A ordem de tipos de mensagem no contrato não é significativa. Depois que o destino recebe a primeira mensagem, o Service Broker permite que cada lado da conversação envie qualquer mensagem permitida para aquele lado a qualquer hora. Por exemplo, se o iniciador da conversação puder enviar o tipo de mensagem //Adventure-Works.com/Expenses/SubmitExpense, o Service Broker permitirá que o iniciador envie qualquer número de mensagens SubmitExpense durante a conversação.

Os tipos e as direções de mensagens não podem ser alterados em um contrato. Para alterar a AUTHORIZATION para um contrato, use a instrução ALTER AUTHORIZATION.

Um contrato deve permitir que o iniciador envie uma mensagem. A instrução CREATE CONTRACT falha quando o contrato não contém pelo menos um tipo de mensagem que seja SENT BY ANY ou SENT BY INITIATOR.

Independentemente do contrato, um serviço pode sempre receber os tipos de mensagem https://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer, https://schemas.microsoft.com/SQL/ServiceBroker/Error e https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog. O Service Broker utiliza esses tipos para mensagens do sistema para o aplicativo. Para obter mais informações sobre tipos de mensagem fornecidos pelo agente, consulte Mensagens do sistema do Service Broker.

Um contrato não pode ser um objeto temporário. Os nomes de contrato que começam com # são permitidos, mas são objetos permanentes.

Permissões

Por padrão, os membros das funções de banco de dados fixas db_ddladmin e db_owner ou da função de servidor fixa sysadmin podem criar contratos.

Por padrão, o proprietário do contrato, membros das funções de banco de dados fixas db_ddladmin e db_owner e membros da função de servidor fixa sysadmin têm a permissão REFERENCES em um contrato.

O usuário que executa a instrução CREATE CONTRACT deve ter a permissão REFERENCES em todos os tipos de mensagem especificados.

Exemplos

A. Criando um contrato

O exemplo a seguir cria um contrato de reembolso de despesas com base em três tipos de mensagem.

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