CREATE CONTRACT (Transact-SQL)
Crée un nouveau contrat. Un contrat définit les types de messages utilisés dans une conversation Service Broker et détermine quel côté de la conversation peut envoyer des messages de ce type. Chaque conversation observe un contrat. Le service initiateur spécifie le contrat associé à la conversation au début de celle-ci. Le service cible spécifie les contrats pour lesquels il accepte des conversations.
Conventions de la syntaxe de Transact-SQL
Syntaxe
CREATE CONTRACT contract_name
[ AUTHORIZATION owner_name ]
( { { message_type_name | [ DEFAULT ] }
SENT BY { INITIATOR | TARGET | ANY }
} [ ,...n] )
[ ; ]
Arguments
- contract_name
Nom du contrat à créer. Un nouveau contrat est créé dans la base de données active et il appartient à l'entité de sécurité spécifiée dans la clause AUTHORIZATION. Vous ne pouvez pas spécifier les noms de serveur, de base de données et de schéma. L'argument contract_name peut comporter jusqu'à 128 caractères.
- AUTHORIZATION owner_name
Définit comme propriétaire du contrat le rôle ou l'utilisateur de base de données spécifié. Lorsque l'utilisateur actuel est dbo ou sa, l'argument owner_name peut être le nom de n'importe quel utilisateur ou rôle valide. Sinon, owner_name doit être le nom de l'utilisateur actif, le nom d'un utilisateur pour lequel l'utilisateur actif possède des autorisations d'emprunt d'identité ou le nom d'un rôle auquel appartient l'utilisateur actif. Lorsque cette clause est omise, le contrat appartient à l'utilisateur actif.
- message_type_name
Nom d'un type de message à inclure dans le contrat.
- SENT BY
Spécifie quel point de terminaison peut envoyer un message du type indiqué. Les contrats mentionnent les messages que les services peuvent utiliser pour avoir des conversations spécifiques. Chaque conversation comporte deux points de terminaison : l'initiateur (service qui lance la conversation) et la cible (service contacté par l'initiateur).
- INITIATOR
Indique que seul l'initiateur de la conversation peut envoyer des messages du type spécifié. Un service qui lance une conversation est appelé l'initiateur de cette conversation.
- TARGET
Indique que seule la cible de la conversation peut envoyer des messages du type spécifié. Un service qui accepte une conversation lancée par un autre service est appelé la cible de cette conversation.
- ANY
Indique que les messages de ce type peuvent être envoyés par l'initiateur comme par la cible de la conversation.
- [ DEFAULT ]
Indique que le contrat prend en charge les messages du type de message par défaut. Par défaut, toutes les bases de données contiennent un type de message nommé DEFAULT. Ce type de message utilise l'option de validation NONE. Dans le contexte de cette clause, DEFAULT n'est pas un mot clé et doit être délimité comme un identificateur. MicrosoftSQL Server fournit également un contrat DEFAULT qui spécifie le type de message DEFAULT.
Notes
L'ordre des types de messages dans le contrat n'a pas d'importance. Une fois que la cible a reçu le premier message, Service Broker permet à chaque côté de la conversation d'envoyer à tout moment les messages autorisés pour le côté considéré. Par exemple, si l'initiateur de la conversation peut envoyer le type de message //Adventure-Works.com/Expenses/SubmitExpense, Service Broker l'autorise à envoyer n'importe quel nombre de messages SubmitExpense à tout moment de la conversation.
Il est impossible de modifier les types de messages et leurs directions dans un contrat. Pour modifier le paramètre AUTHORIZATION au niveau d'un contrat, utilisez l'instruction ALTER AUTHORIZATION.
Un contrat doit permettre à l'initiateur d'envoyer un message. L'instruction CREATE CONTRACT échoue lorsque le contrat ne contient pas au moins un type de message SENT BY ANY ou SENT BY INITIATOR.
Indépendamment du contrat, un service peut toujours recevoir les types de messages https://schemas.microsoft.com/SQL/ServiceBroker/Messages/DialogTimer, https://schemas.microsoft.com/SQL/ServiceBroker/Messages/Error et https://schemas.microsoft.com/SQL/ServiceBroker/Messages/EndDialog. Service Broker utilise ces types de messages pour les messages système adressés à l'application. Pour plus d'informations sur les types de messages émis par Service Broker, consultez Messages Service Broker.
Un contrat ne peut pas être un objet temporaire. Les noms de contrat commençant par # sont autorisés, mais ce sont des objets permanents.
Autorisations
Par défaut, l'autorisation de création de contrat est accordée aux membres du rôle de base de données fixe db_ddladmin ou db_owner et aux membres du rôle serveur fixe sysadmin.
L'autorisation REFERENCES sur un contrat est accordée par défaut au propriétaire du contrat, aux membres du rôle de base de données fixe db_ddladmin ou db_owner et aux membres du rôle serveur fixe sysadmin.
L'utilisateur exécutant l'instruction CREATE SERVICE doit disposer de l'autorisation REFERENCES sur tous les types de messages spécifiés.
Exemple
A. Création d'un contrat
L'exemple suivant crée un contrat de remboursement de frais basé sur trois types de messages.
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
) ;
Voir aussi
Référence
DROP CONTRACT (Transact-SQL)
EVENTDATA (Transact-SQL)
Autres ressources
Contrats
Types de messages
Didacticiels de Service Broker