MULAI PERCAKAPAN DIALOG (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL Managed Instance

Memulai dialog dari satu layanan ke layanan lain. Dialog adalah percakapan yang menyediakan olahpesan tepat sekali berurutan antara dua layanan.

Konvensi sintaks transact-SQL

Sintaksis

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 }  ] ]  
[ ; ]  

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

@dialog_handle
Adalah variabel yang digunakan untuk menyimpan handel dialog yang dihasilkan sistem untuk dialog baru yang dikembalikan oleh pernyataan BEGIN DIALOG CONVERSATION. Variabel harus berjenis uniqueidentifier.

DARI initiator_service_name LAYANAN
Menentukan layanan yang memulai dialog. Nama yang ditentukan harus merupakan nama layanan dalam database saat ini. Antrean yang ditentukan untuk layanan inisiator menerima pesan yang dikembalikan oleh layanan target dan pesan yang dibuat oleh Service Broker untuk percakapan ini.

KE LAYANAN 'target_service_name'
Menentukan layanan target untuk memulai dialog. Target_service_name berjenis nvarchar(256). Service Broker menggunakan perbandingan byte-byte untuk mencocokkan string target_service_name . Dengan kata lain, perbandingan peka huruf besar/kecil dan tidak memperhitungkan kolate saat ini.

service_broker_guid
Menentukan database yang menghosting layanan target. Ketika lebih dari satu database menghosting instans layanan target, Anda dapat berkomunikasi dengan database tertentu dengan menyediakan service_broker_guid.

Service_broker_guid berjenis nvarchar(128). Untuk menemukan service_broker_guid database, jalankan kueri berikut dalam database:

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

Catatan

Opsi ini tidak tersedia dalam database mandiri.

'DATABASE SAAT INI'
Menentukan bahwa percakapan menggunakan service_broker_guid untuk database saat ini.

CONTRACT_NAME KONTRAK
Menentukan kontrak yang diikuti percakapan ini. Kontrak harus ada di database saat ini. Jika layanan target tidak menerima percakapan baru pada kontrak yang ditentukan, Service Broker mengembalikan pesan kesalahan pada percakapan. Ketika klausul ini dihilangkan, percakapan mengikuti kontrak bernama DEFAULT.

=related_conversation_handle RELATED_CONVERSATION
Menentukan grup percakapan yang sudah ada tempat dialog baru ditambahkan. Saat klausa ini ada, dialog baru termasuk dalam grup percakapan yang sama dengan dialog yang ditentukan oleh related_conversation_handle. Related_conversation_handleharus berjenis implisit convertible untuk mengetik uniqueidentifier. Pernyataan gagal jika related_conversation_handle tidak mereferensikan dialog yang ada.

=related_conversation_group_id RELATED_CONVERSATION_GROUP
Menentukan grup percakapan yang sudah ada tempat dialog baru ditambahkan. Ketika klausa ini ada, dialog baru akan ditambahkan ke grup percakapan yang ditentukan oleh related_conversation_group_id. Related_conversation_group_idharus dari jenis yang secara implisit dapat dikonversi untuk mengetik pengidentifikasi unik. Jika related_conversation_group_idtidak mereferensikan grup percakapan yang sudah ada, broker layanan membuat grup percakapan baru dengan related_conversation_group_id yang ditentukan dan menghubungkan dialog baru dengan grup percakapan tersebut.

dialog_lifetime SEUMUR =HIDUP
Menentukan jumlah waktu maksimum dialog akan tetap terbuka. Agar dialog berhasil diselesaikan, kedua titik akhir harus secara eksplisit mengakhiri dialog sebelum masa pakai berakhir. Nilai dialog_lifetime harus dinyatakan dalam hitung detik. Masa pakai berjenis int. Ketika tidak ada klausa LIFETIME yang ditentukan, masa pakai dialog adalah nilai maksimum jenis data int .

ENKRIPSI
Menentukan apakah pesan yang dikirim dan diterima pada dialog ini harus dienkripsi ketika dikirim di luar instans Microsoft SQL Server. Dialog yang harus dienkripsi adalah dialog aman. Ketika ENCRYPTION = ON dan sertifikat yang diperlukan untuk mendukung enkripsi tidak dikonfigurasi, Service Broker mengembalikan pesan kesalahan pada percakapan. Jika ENKRIPSI = NONAKTIF, enkripsi digunakan jika pengikatan layanan jarak jauh dikonfigurasi untuk target_service_name; jika tidak, pesan dikirim tidak terenkripsi. Jika klausul ini tidak ada, nilai defaultnya adalah AKTIF.

Catatan

Pesan yang ditukar dengan layanan dalam instans SQL Server yang sama tidak pernah dienkripsi. Namun, kunci master database dan sertifikat untuk enkripsi masih diperlukan untuk percakapan yang menggunakan enkripsi jika layanan untuk percakapan berada dalam database yang berbeda. Ini memungkinkan percakapan untuk melanjutkan jika salah satu database dipindahkan ke instans yang berbeda saat percakapan sedang berlangsung.

Keterangan

Semua pesan adalah bagian dari percakapan. Oleh karena itu, layanan yang memulai harus memulai percakapan dengan layanan target sebelum mengirim pesan ke layanan target. Informasi yang ditentukan dalam pernyataan BEGIN DIALOG CONVERSATION mirip dengan alamat pada huruf; Service Broker menggunakan informasi untuk mengirimkan pesan ke layanan yang benar. Layanan yang ditentukan dalam klausul TO SERVICE adalah alamat tempat pesan dikirim. Layanan yang ditentukan dalam klausul FROM SERVICE adalah alamat pengembalian yang digunakan untuk pesan balasan.

Target percakapan tidak perlu memanggil BEGIN DIALOG CONVERSATION. Service Broker membuat percakapan di database target ketika pesan pertama dalam percakapan tiba dari inisiator.

Memulai dialog membuat titik akhir percakapan di database untuk layanan yang memulai, tetapi tidak membuat koneksi jaringan ke instans yang menghosting layanan target. Service Broker tidak menjalin komunikasi dengan target dialog hingga pesan pertama dikirim.

Saat pernyataan BEGIN DIALOG CONVERSATION tidak menentukan percakapan terkait atau grup percakapan terkait, Service Broker membuat grup percakapan baru untuk percakapan baru.

Service Broker tidak mengizinkan pengelompokan percakapan arbitrer. Semua percakapan dalam grup percakapan harus memiliki layanan yang ditentukan dalam klausa FROM sebagai inisiator atau target percakapan.

Perintah BEGIN DIALOG CONVERSATION mengunci grup percakapan yang berisi dialog_handle dikembalikan. Saat perintah menyertakan klausa RELATED_CONVERSATION_GROUP, grup percakapan untuk dialog_handle adalah grup percakapan yang ditentukan dalam parameter related_conversation_group_id . Saat perintah menyertakan klausa RELATED_CONVERSATION, grup percakapan untuk dialog_handle adalah grup percakapan yang terkait dengan related_conversation_handle yang ditentukan.

BEGIN DIALOG CONVERSATION tidak valid dalam fungsi yang ditentukan pengguna.

Izin

Untuk memulai dialog, pengguna saat ini harus memiliki izin RECEIVE pada antrean untuk layanan yang ditentukan dalam klausa FROM dari perintah dan izin REFERENCES untuk kontrak yang ditentukan.

Contoh

J. Memulai dialog

Contoh berikut memulai percakapan dialog dan menyimpan pengidentifikasi untuk dialog dalam @dialog_handle. Layanan //Adventure-Works.com/ExpenseClient adalah inisiator untuk dialog, dan //Adventure-Works.com/Expenses layanan adalah target dialog. Dialog mengikuti kontrak //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. Memulai dialog dengan masa pakai eksplisit

Contoh berikut memulai percakapan dialog dan menyimpan pengidentifikasi untuk dialog di @dialog_handle. Layanan //Adventure-Works.com/ExpenseClient ini adalah inisiator untuk dialog, dan //Adventure-Works.com/Expenses layanan adalah target dialog. Dialog mengikuti kontrak //Adventure-Works.com/Expenses/ExpenseSubmission. Jika dialog belum ditutup oleh perintah END CONVERSATION dalam hitungan 60 detik, broker mengakhiri dialog dengan kesalahan.

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. Memulai dialog dengan instans broker tertentu

Contoh berikut memulai percakapan dialog dan menyimpan pengidentifikasi untuk dialog di @dialog_handle. Layanan //Adventure-Works.com/ExpenseClient ini adalah inisiator untuk dialog, dan //Adventure-Works.com/Expenses layanan adalah target dialog. Dialog mengikuti kontrak //Adventure-Works.com/Expenses/ExpenseSubmission. Broker merutekan pesan pada dialog ini ke broker yang diidentifikasi oleh 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. Memulai dialog, dan menghubungkannya dengan grup percakapan yang sudah ada

Contoh berikut memulai percakapan dialog dan menyimpan pengidentifikasi untuk dialog di @dialog_handle. Layanan //Adventure-Works.com/ExpenseClient ini adalah inisiator untuk dialog, dan //Adventure-Works.com/Expenses layanan adalah target dialog. Dialog mengikuti kontrak //Adventure-Works.com/Expenses/ExpenseSubmission. Broker mengaitkan dialog dengan grup percakapan yang diidentifikasi sebagai @conversation_group_id ganti membuat grup percakapan baru.

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. Memulai dialog dengan masa pakai eksplisit, dan berkaitan dengan dialog dengan percakapan yang sudah ada

Contoh berikut memulai percakapan dialog dan menyimpan pengidentifikasi untuk dialog di @dialog_handle. Layanan //Adventure-Works.com/ExpenseClient ini adalah inisiator untuk dialog, dan //Adventure-Works.com/Expenses layanan adalah target dialog. Dialog mengikuti kontrak //Adventure-Works.com/Expenses/ExpenseSubmission. Dialog baru milik grup @existing_conversation_handle percakapan yang sama miliknya. Jika dialog belum ditutup oleh perintah END CONVERSATION dalam hitungan 600 detik, Service Broker mengakhiri dialog dengan kesalahan.

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. Memulai dialog dengan enkripsi opsional

Contoh berikut memulai dialog dan menyimpan pengidentifikasi untuk dialog di @dialog_handle. Layanan //Adventure-Works.com/ExpenseClient ini adalah inisiator untuk dialog, dan //Adventure-Works.com/Expenses layanan adalah target dialog. Dialog mengikuti kontrak //Adventure-Works.com/Expenses/ExpenseSubmission. Percakapan dalam contoh ini memungkinkan pesan untuk melakukan perjalanan melalui jaringan tanpa enkripsi jika enkripsi tidak tersedia.

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 ;  

Lihat Juga

MULAI TIMER PERCAKAPAN (Transact-SQL)
AKHIRI PERCAKAPAN (Transact-SQL)
PINDAHKAN PERCAKAPAN (Transact-SQL)
sys.conversation_endpoints (T-SQL)