CREATE CONTRACT (Transact-SQL)
Cria um novo contrato. Um contrato define os tipos de mensagem que são usados em uma conversa do Service Broker e também determina qual lado da conversa pode enviar mensagens daquele tipo. Cada conversa segue um contrato. O serviço iniciador especifica o contrato para a conversa quando esta inicia. O serviço de destino especifica os contratos para os quais o serviço de destino aceita conversas.
Convenções da 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çã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 conversas específicas. Cada conversa possui dois pontos de extremidade: o ponto iniciador, o serviço que iniciou a conversa, e o ponto de destino, o serviço que o iniciador está contatando.INITIATOR
Indica que somente o iniciador da conversa pode enviar mensagens do tipo especificado. Um serviço que inicia uma conversa é chamado de iniciador da conversa.TARGET
Indica que somente o destino da conversa pode enviar mensagens do tipo especificado. Um serviço que aceita uma conversa iniciada por outro serviço é chamado de destino da conversa.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 envie qualquer mensagem permitida para aquele lado a qualquer hora. Por exemplo, se o iniciador da conversa 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.
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 sempre poderá 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 usa esses tipos de mensagem para mensagens de sistema enviadas ao aplicativo.
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
) ;