MULAI PERCAKAPAN DIALOG (Transact-SQL)
Berlaku untuk: SQL Server Azure SQL Managed Instance
Memulai dialog dari satu layanan ke layanan lain. Dialog adalah percakapan yang menyediakan olahpesan tepat sekali berurutan antara dua layanan.
Sintaks
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 } ] ]
[ ; ]
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)