BEGIN DIALOG CONVERSATION (Transact-SQL)

Commence un dialogue entre deux services. Un dialogue est une conversation qui fournit les messages exactement dans l'ordre entre deux services.

Icône Lien de rubriqueConventions de la syntaxe Transact-SQL

Syntaxe

BEGIN DIALOG [ CONVERSATION ] @dialog_handle
   FROM SERVICE initiator_service_name
   TO SERVICE 'target_service_name'
       [ , { 'service_broker_guid' | 'CURRENT DATABASE' }] 
   [ ON CONTRACT contract_name ]
   [ WITH
   [  { RELATED_CONVERSATION = related_conversation_handle 
      | RELATED_CONVERSATION_GROUP = related_conversation_group_id } ] 
   [ [ , ] LIFETIME = dialog_lifetime ] 
   [ [ , ] ENCRYPTION = { ON | OFF }  ] ]
[ ; ]

Arguments

  • **@**dialog_handle
    Variable utilisée pour stocker le handle de dialogue généré par le système pour le nouveau dialogue retourné par l'instruction BEGIN DIALOG CONVERSATION. Elle doit être de type uniqueidentifier.

  • FROM SERVICE initiator_service_name
    Spécifie le service qui initie le dialogue. Le nom spécifié doit être le nom d'un service de la base de données active. La file d'attente spécifiée pour le service initiateur reçoit les messages retournés par le service cible et les messages créés par Service Broker pour cette conversation.

  • TO SERVICE 'target_service_name'
    Spécifie le service cible avec lequel le dialogue doit être initialisé. Le paramètre target_service_name est de type nvarchar(256). Service Broker utilise une comparaison octet par octet pour la concordance avec la chaîne target_service_name. La comparaison est donc sensible à la casse et ne tient pas compte du classement actuel.

  • service_broker_guid
    Spécifie la base de données qui héberge le service cible. Lorsque plusieurs bases de données hébergent une instance du service cible, vous pouvez communiquer avec une base de données spécifique en spécifiant un service_broker_guid.

    L'argument service_broker_guid est de type nvarchar(128). Pour rechercher la chaîne service_broker_guid pour une base de données, exécutez la requête ci-après dans la base de données :

    SELECT service_broker_guid
    FROM sys.databases
    WHERE database_id = DB_ID() ;
    

    Pour plus d'informations sur l'identité Service Broker, consultez Gestion des identités Service Broker.

  • 'CURRENT DATABASE'
    Spécifie que la conversation utilise l'identificateur service_broker_guid pour la base de données active.

  • ON CONTRACT contract_name
    Spécifie le contrat suivi par cette conversation. Le contrat doit déjà exister dans la base de données active. Si le service cible n'accepte pas de nouvelles conversations dans le contrat spécifié, Service Broker retourne un message d'erreur sur la conversation. Si cette clause est omise, la conversation suit le contrat nommé DEFAULT.

  • RELATED_CONVERSATION **=**related_conversation_handle
    Spécifie le groupe de conversations existant auquel le nouveau dialogue est ajouté. Si cette clause est spécifiée, le nouveau dialogue appartient au même groupe de conversations que le dialogue spécifié par related_conversation_handle. related_conversation_handledoit être d'un type convertible implicitement en type uniqueidentifier. L'instruction échoue si related_conversation_handle ne référence pas un dialogue existant.

  • RELATED_CONVERSATION_GROUP **=**related_conversation_group_id
    Spécifie le groupe de conversations existant auquel le nouveau dialogue est ajouté. Si cette clause est spécifiée, le nouveau dialogue sera ajouté au groupe de conversations spécifié par related_conversation_group_id. related_conversation_group_iddoit être d'un type convertible implicitement en type uniqueidentifier. Si related_conversation_group_idne référence pas un groupe de conversations existant, Service Broker crée un nouveau groupe de conversations à l'aide de la chaîne related_conversation_group_id spécifiée et met en relation le nouveau dialogue avec ce groupe de conversations.

  • LIFETIME **=**dialog_lifetime
    Spécifie la durée maximale pendant laquelle le dialogue restera ouvert. Pour que le dialogue s'achève avec succès, les deux points de terminaison doivent explicitement se terminer avant l'expiration de la durée de vie. La valeur dialog_lifetime doit être exprimée en secondes. La durée de vie est de type int. Si la clause LIFETIME n'est pas spécifiée, la durée de vie du dialogue correspond à la valeur maximale du type de données int.

  • ENCRYPTION
    Spécifie si les messages envoyés et reçus dans ce dialogue doivent être chiffrés lorsqu'ils sont envoyés hors d'une instance de Microsoft SQL Server. Un dialogue qui ne doit pas être chiffré est un dialogue sécurisé. Si ENCRYPTION = ON et que les certificats nécessaires au chiffrement ne sont pas configurés, Service Broker retourne un message d'erreur sur la conversation. Si ENCRYPTION = OFF, le chiffrement est utilisé si une liaison de service distant est configurée pour target_service_name ; sinon, les messages sont envoyés sans être chiffrés. Si cette clause est omise, la valeur par défaut est ON. Pour plus d'informations sur la sécurité des dialogues, consultez Sécurité du dialogue Service Broker.

    Notes

    Les messages échangés avec les services dans la même instance de SQL Server ne sont jamais chiffrés. Cependant, la clé principale de base de données et les certificats nécessaires au chiffrement sont requis pour les conversations qui utilisent le chiffrement si les services de la conversation se trouvent dans des bases de données distinctes. Cela permet la poursuite des conversations dans le cas où une des bases de données est déplacée vers une autre instance au cours de la conversation.

Notes

Tous les messages font partie intégrante d'une conversation. Par conséquent, un service initiateur doit commencer une conversation avec le service cible avant d'envoyer un message à ce dernier. Les informations spécifiées dans l'instruction BEGIN DIALOG CONVERSATION sont identiques à celles spécifiées dans l'adresse d'une lettre ; Service Broker utilise ces informations pour remettre les messages au service approprié. Le service spécifié dans la clause TO SERVICE est l'adresse à laquelle les messages sont envoyés. Le service spécifié dans la clause FROM SERVICE est l'adresse de l'expéditeur utilisée pour les messages de réponse.

La cible d'une conversation ne doit pas appeler l'instruction BEGIN DIALOG CONVERSATION. Service Broker crée une conversation dans la base de données cible lorsque le premier message de la conversation est reçu de l'initiateur.

La création d'un dialogue entraîne la création d'un point de terminaison de la conversation dans la base de données pour le service initiateur, mais ne crée pas de connexion réseau à l'instance hôte du service cible. Service Broker n'établit pas la communication avec la cible du dialogue tant que le premier message n'a pas été envoyé.

Si l'instruction BEGIN DIALOG CONVERSATION ne spécifie aucune conversation associée ni aucun groupe de conversations associé, Service Broker crée un nouveau groupe de conversations pour la nouvelle conversation.

Service Broker n'autorise aucun regroupement arbitraire des conversations. Pour toutes les conversations d'un groupe de conversations, le service doit être spécifié dans la clause FROM en tant qu'initiateur ou cible de la conversation.

La commande BEGIN DIALOG CONVERSATION verrouille le groupe de conversations qui contient la chaîne dialog_handle retournée. Si une commande comporte une clause RELATED_CONVERSATION_GROUP, le groupe de conversations pour dialog_handle est le groupe de conversations spécifié dans le paramètre related_conversation_group_id. Si la commande comporte une clause RELATED_CONVERSATION, le groupe de conversations pour dialog_handle est le groupe de conversations associé au paramètre related_conversation_handle spécifié.

BEGIN DIALOG CONVERSATION n'est pas valide dans une fonction définie par l'utilisateur.

Autorisations

Pour commencer un dialogue, l'utilisateur actuel doit disposer de l'autorisation RECEIVE sur la file d'attente du service spécifié dans la clause FROM de la commande et de l'autorisation REFERENCES pour le contrat spécifié.

Exemples

A. Début d'un dialogue

L'exemple suivant commence une conversation et stocke l'identificateur du dialogue dans @dialog_handle. Le service //Adventure-Works.com/ExpenseClient est l'initiateur du dialogue et le service //Adventure-Works.com/Expenses est la cible du dialogue. Le dialogue respecte le contrat //Adventure-Works.com/Expenses/ExpenseSubmission.

DECLARE @dialog_handle UNIQUEIDENTIFIER ;

BEGIN DIALOG CONVERSATION @dialog_handle
   FROM SERVICE [//Adventure-Works.com/ExpenseClient]
   TO SERVICE '//Adventure-Works.com/Expenses'
   ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission] ;

B. Début d'un dialogue avec une durée de vie explicite

L'exemple suivant commence une conversation et stocke l'identificateur du dialogue dans @dialog_handle. Le service //Adventure-Works.com/ExpenseClient est l'initiateur du dialogue et le service //Adventure-Works.com/Expenses est la cible du dialogue. Le dialogue respecte le contrat //Adventure-Works.com/Expenses/ExpenseSubmission. Si le dialogue n'est pas fermé par la commande END CONVERSATION dans les 60 secondes, Service Broker met fin au dialogue en signalant une erreur.

DECLARE @dialog_handle UNIQUEIDENTIFIER ;

BEGIN DIALOG CONVERSATION @dialog_handle
   FROM SERVICE [//Adventure-Works.com/ExpenseClient]
   TO SERVICE '//Adventure-Works.com/Expenses'
   ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission]
   WITH LIFETIME = 60 ;

C. Début d'un dialogue avec une instance de Service Broker spécifique

L'exemple suivant commence une conversation et stocke l'identificateur du dialogue dans @dialog_handle. Le service //Adventure-Works.com/ExpenseClient est l'initiateur du dialogue et le service //Adventure-Works.com/Expenses est la cible du dialogue. Le dialogue respecte le contrat //Adventure-Works.com/Expenses/ExpenseSubmission. Service Broker achemine les messages de ce dialogue au service Broker identifié par le GUID a326e034-d4cf-4e8b-8d98-4d7e1926c904.

DECLARE @dialog_handle UNIQUEIDENTIFIER ;

BEGIN DIALOG CONVERSATION @dialog_handle
   FROM SERVICE [//Adventure-Works.com/ExpenseClient]
   TO SERVICE '//Adventure-Works.com/Expenses', 
              'a326e034-d4cf-4e8b-8d98-4d7e1926c904'
   ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission] ;

D. Début d'un dialogue et mise en relation avec un groupe de conversations existant

L'exemple suivant commence une conversation et stocke l'identificateur du dialogue dans @dialog_handle. Le service //Adventure-Works.com/ExpenseClient est l'initiateur du dialogue et le service //Adventure-Works.com/Expenses est la cible du dialogue. Le dialogue respecte le contrat //Adventure-Works.com/Expenses/ExpenseSubmission. Service Broker associe le dialogue au groupe de conversation identifié par @conversation_group_id au lieu de créer un nouveau groupe de conversations.

DECLARE @dialog_handle UNIQUEIDENTIFIER ;
DECLARE @conversation_group_id UNIQUEIDENTIFIER ;

SET @conversation_group_id = <retrieve conversation group ID from database>

BEGIN DIALOG CONVERSATION @dialog_handle
   FROM SERVICE [//Adventure-Works.com/ExpenseClient]
   TO SERVICE '//Adventure-Works.com/Expenses'
   ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission]
   WITH RELATED_CONVERSATION_GROUP = @conversation_group_id ;

E. Début d'un dialogue avec une durée de vie explicite et mise en relation avec une conversation existante

L'exemple suivant commence une conversation et stocke l'identificateur du dialogue dans @dialog_handle. Le service //Adventure-Works.com/ExpenseClient est l'initiateur du dialogue et le service //Adventure-Works.com/Expenses est la cible du dialogue. Le dialogue respecte le contrat //Adventure-Works.com/Expenses/ExpenseSubmission. Le nouveau dialogue appartient au même groupe de conversations que @existing_conversation_handle. Si le dialogue n'est pas fermé par la commande END CONVERSATION dans les 600 secondes, Service Broker met fin au dialogue en signalant une erreur.

DECLARE @dialog_handle UNIQUEIDENTIFIER
DECLARE @existing_conversation_handle UNIQUEIDENTIFIER

SET @existing_conversation_handle = <retrieve conversation handle from database>

BEGIN DIALOG CONVERSATION @dialog_handle
   FROM SERVICE [//Adventure-Works.com/ExpenseClient]
   TO SERVICE '//Adventure-Works.com/Expenses'
   ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission]
   WITH RELATED_CONVERSATION = @existing_conversation_handle
   LIFETIME = 600 ;

F. Début d'un dialogue et chiffrement facultatif

L'exemple suivant commence un dialogue et stocke l'identificateur du dialogue dans @dialog_handle. Le service //Adventure-Works.com/ExpenseClient est l'initiateur du dialogue et le service //Adventure-Works.com/Expenses est la cible du dialogue. Le dialogue respecte le contrat //Adventure-Works.com/Expenses/ExpenseSubmission. Dans cet exemple, la conversation permet aux messages d'être transmis sur le réseau sans être chiffrés si le chiffrement n'est pas disponible.

DECLARE @dialog_handle UNIQUEIDENTIFIER

BEGIN DIALOG CONVERSATION @dialog_handle
   FROM SERVICE [//Adventure-Works.com/ExpenseClient]
   TO SERVICE '//Adventure-Works.com/Expenses'
   ON CONTRACT [//Adventure-Works.com/Expenses/ExpenseSubmission]
   WITH ENCRYPTION = OFF ;