BEGIN DIALOG CONVERSATION (Transact-SQL)

Şunlar için geçerlidir: SQL Server Azure SQL Yönetilen Örneği

Bir servisden diğerine diyalog başlatır. Diyalog, iki servis arasında tam olarak bir kez mesajlaşma sağlayan bir konuşmadır.

Transact-SQL söz dizimi kuralları

Syntax

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
Değişken, ifadenin geri döndüğü BEGIN DIALOG CONVERSATION yeni diyalog için sistem tarafından oluşturulan diyalog kolunu depolamak için kullanılan bir değişkendir. Değişken benzersiz tanımlayıcı türünde olmalıdır.

initiator_service_nameSERVICE
Diyalogu başlatan servisi belirtir. Belirtilen isim, mevcut veritabanındaki bir hizmetin adı olmalıdır. Başlatıcı servis için belirlenen kuyruk, hedef hizmet tarafından geri gönderilen mesajları ve bu konuşma için Service Broker tarafından oluşturulan mesajları alır.

'SERVICEtarget_service_name'
Diyalogun başlatılacağı hedef hizmeti belirtir. target_service_namenvarchar(256) tipindendir. Service Broker, target_service_name dizisini eşleştirmek için bayt bayt karşılaştırma kullanır. Başka bir deyişle, karşılaştırma büyük harf duyarlıdır ve mevcut derlemeyi dikkate almaz.

service_broker_guid
Hedef servisi barındıran veritabanını belirtir. Birden fazla veritabanı hedef hizmetin bir örneğini barındırdığında, belirli bir veritabanı ile service_broker_guid sağlayarak iletişim kurabilirsiniz.

service_broker_guidnvarchar(128) tipindendir. Bir veritabanı için service_broker_guid bulmak için, veritabanında aşağıdaki sorguyu çalıştırın:

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

Note

Bu seçenek, kapalı bir veritabanında mevcut değildir.

'GÜNCEL DATABASE'
Konuşmanın mevcut veritabanı için service_broker_guid kullandığını belirtir.

ON CONTRACTcontract_name
Bu konuşmanın takip ettiği sözleşmeyi belirtir. Sözleşme mevcut veritabanında bulunmalıdır. Hedef hizmet belirtilen sözleşmede yeni konuşmaları kabul etmezse, Hizmet Brokerı konuşmada hata mesajı döndürür. Bu madde atıldığında, konuşma ' adlı sözleşmeyi DEFAULTtakip eder.

RELATED_CONVERSATION =related_conversation_handle
Yeni diyalogun eklendiği mevcut konuşma grubunu belirtir. Bu cümle bulunduğunda, yeni diyalog related_conversation_handle tarafından belirtilen diyalogla aynı konuşma grubuna aiddir. related_conversation_handle, örtük olarak benzersiz tanımlayıcıya dönüştürülebilir bir türde olmalıdır. related_conversation_handle mevcut bir diyaloga referans vermiyorsa ifade başarısız olur.

RELATED_CONVERSATION_GROUP =related_conversation_group_id
Yeni diyalogun eklendiği mevcut konuşma grubunu belirtir. Bu cümle bulunduğunda, yeni diyalog related_conversation_group_id tarafından belirtilen konuşma grubuna eklenecektir. related_conversation_group_id, benzersiz tanımlayıcı tipine dolaylı olarak dönüştürülebilir bir türde olmalıdır. Eğer related_conversation_group_idmevcut bir konuşma grubuna referans vermiyorsa, hizmet aracı belirtilen related_conversation_group_id ile yeni bir konuşma grubu oluşturur ve yeni diyalogu o konuşma grubuna ilişkilendirir.

ÖMÜR =BOYU dialog_lifetime
Diyalogun açık kalacağı maksimum süreyi belirtir. Diyalogun başarılı bir şekilde tamamlanması için, her iki uç nokta da ömrü dolmadan diyalogu açıkça sonlandırmalıdır. dialog_lifetime değeri saniyeler cinsinden ifade edilmelidir. Lifetime ise bir tür int. LIFETIME maddesi belirtilmediğinde, diyalog ömrü int veri türünün maksimum değeridir.

ŞİFRELEME
Bu diyalogda gönderilen ve alınan mesajların Microsoft SQL Server'ın bir örneği dışında gönderildiğinde şifrelenip şifrelenmemesi gerektiğini belirtir. Şifrelenmesi gereken diyalog, güvenli bir diyalogdur. Şifreleme = AÇIK ve şifrelemeyi desteklemek için gereken sertifikalar konfigure edilmediğinde, Service Broker konuşmada hata mesajı döndürür. Eğer ŞİFRELEME = KAPALıysa, target_service_name için uzaktan hizmet bağlaması yapılandırılmışsa şifreleme kullanılır; aksi takdirde mesajlar şifrelenmemiş şekilde gönderilir. Bu madde yoksa, varsayılan değer ONUR'dur.

Note

Aynı SQL Server örneğindeki servislerle değiş tokuş edilen mesajlar asla şifrelenmez. Ancak, konuşma hizmetleri farklı veritabanlarında olursa, şifreleme kullanan konuşmalar için bir veritabanı ana anahtarı ve şifreleme sertifikaları yine de gereklidir. Bu, veritabanlarından biri konuşma devam ederken başka bir instance'a taşındığında konuşmaların devam etmesini sağlar.

Remarks

Tüm mesajlar bir sohbetin parçasıdır. Bu nedenle, başlatan hizmet, hedef hizmete mesaj göndermeden önce hedef hizmetle bir konuşmaya başlamalıdır. Açıklamada BEGIN DIALOG CONVERSATION belirtilen bilgiler, bir mektuptaki adrese benzer; Service Broker, bu bilgileri doğru servise mesaj iletmek için kullanır. TO SERVICE maddesinde belirtilen hizmet, mesajların gönderildiği adrestir. FROM SERVICE maddesinde belirtilen hizmet, yanıt mesajları için kullanılan dönüş adresidir.

Konuşmanın hedefi aramak BEGIN DIALOG CONVERSATIONzorunda değildir. Service Broker, başlatıcıdan gelen ilk mesaj geldiğinde hedef veritabanında bir konuşma oluşturur.

Bir diyalog başlatmak, başlatan hizmet için veritabanında bir konuşma uç noktası oluşturur, ancak hedef hizmeti barındıran örnekle ağ bağlantısı oluşturmaz. Service Broker, ilk mesaj gönderilene kadar diyalogun hedefiyle iletişim kurmaz.

Eğer ifade BEGIN DIALOG CONVERSATION ilgili bir konuşma veya ilgili bir konuşma grubu belirtilmediğinde, Service Broker yeni bir konuşma için yeni bir konuşma grubu oluşturur.

Service Broker, sohbetlerin rastgele gruplanmasına izin vermez. Bir konuşma grubundaki tüm konuşmalar, FROM maddesinde belirtilen hizmetin ya başlatıcısı ya da hedefi olması gerekir.

Komut, BEGIN DIALOG CONVERSATION geri dönen dialog_handle içeren konuşma grubunu kilitler. Komut bir RELATED_CONVERSATION_GROUP maddesi içerdiğinde, dialog_handle için konuşma grubu related_conversation_group_id parametresinde belirtilen konuşma grubudur. Komut RELATED_CONVERSATION maddesi içerdiğinde, dialog_handle için konuşma grubu, belirtilen related_conversation_handle ile ilişkili konuşma grubudur.

BEGIN DIALOG CONVERSATION kullanıcı tanımlı bir fonksiyonda geçerli değildir.

Permissions

Bir diyalog başlatmak için, mevcut kullanıcının komutun FROM maddesinde belirtilen hizmet için kuyruk üzerinde iznine ve belirtilen sözleşme için REFERENCES iznine sahip RECEIVE olması gerekir.

Examples

A. Diyalog başlatmak

Aşağıdaki örnek, bir diyalog konuşması başlatır ve diyalog için tanımlayıcıyı şu @dialog_handle. adreste saklar: //Adventure-Works.com/ExpenseClient Hizmet, diyalogun başlatıcısıdır ve hizmet //Adventure-Works.com/Expenses diyaloğun hedefidir. Diyalog sözleşmeyi //Adventure-Works.com/Expenses/ExpenseSubmissiontakip eder.

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. Açık bir ömür süresiyle bir diyaloğa başlamak

Aşağıdaki örnek, bir diyalog konuşması başlatır ve diyalog için bir tanımlayıcıyı depolar @dialog_handle. Hizmet //Adventure-Works.com/ExpenseClient , diyalogun başlatıcısıdır ve //Adventure-Works.com/Expenses hizmet diyalogun hedefidir. Diyalog sözleşmeyi //Adventure-Works.com/Expenses/ExpenseSubmissiontakip eder. Eğer diyalog komut tarafından saniyeler 60 içinde kapanmazsaEND CONVERSATION, aracı diyalogu bir hatayla sonlandırır.

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. Belirli bir broker örneğiyle diyalog başlatmak

Aşağıdaki örnek, bir diyalog konuşması başlatır ve diyalog için bir tanımlayıcıyı depolar @dialog_handle. Hizmet //Adventure-Works.com/ExpenseClient , diyalogun başlatıcısıdır ve //Adventure-Works.com/Expenses hizmet diyalogun hedefidir. Diyalog sözleşmeyi //Adventure-Works.com/Expenses/ExpenseSubmissiontakip eder. Broker, bu diyalogdaki mesajları GUID tarafından tanımlanan brokera yönlendirir 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. Bir diyalog başlatmak ve bunu mevcut bir konuşma grubuyla ilişkilendirmek

Aşağıdaki örnek, bir diyalog konuşması başlatır ve diyalog için bir tanımlayıcıyı depolar @dialog_handle. Hizmet //Adventure-Works.com/ExpenseClient , diyalogun başlatıcısıdır ve //Adventure-Works.com/Expenses hizmet diyalogun hedefidir. Diyalog sözleşmeyi //Adventure-Works.com/Expenses/ExpenseSubmissiontakip eder. Broker, diyalogu yeni bir konuşma grubu oluşturmak yerine tanımlanan @conversation_group_id konuşma grubuyla ilişkilendirir.

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. Bir diyaloğa açık bir ömür süresiyle başlamak ve bu diyalogu mevcut bir konuşmaya bağlamak

Aşağıdaki örnek, bir diyalog konuşması başlatır ve diyalog için bir tanımlayıcıyı depolar @dialog_handle. Hizmet //Adventure-Works.com/ExpenseClient , diyalogun başlatıcısıdır ve //Adventure-Works.com/Expenses hizmet diyalogun hedefidir. Diyalog sözleşmeyi //Adventure-Works.com/Expenses/ExpenseSubmissiontakip eder. Yeni diyalog, aynı konuşma grubuna @existing_conversation_handle ait. Eğer diyalog komut tarafından saniyeler 600 içinde kapanmazsaEND CONVERSATION, Service Broker diyalogu bir hata ile sonlandırır.

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. Diyaloga isteğe bağlı şifreleme ile başlatmak

Aşağıdaki örnek bir diyalogu başlatır ve diyalog için tanımlayıcıyı depolar @dialog_handle. Hizmet //Adventure-Works.com/ExpenseClient , diyalogun başlatıcısıdır ve //Adventure-Works.com/Expenses hizmet diyalogun hedefidir. Diyalog sözleşmeyi //Adventure-Works.com/Expenses/ExpenseSubmissiontakip eder. Bu örnekteki konuşma, şifreleme mevcut değilse mesajın ağ üzerinden şifrelemesiz olarak taşınmasına izin verir.

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 ;  

Ayrıca Bkz.

BEGIN CONVERSATION TIMER (Transact-SQL)
END CONVERSATION (Transact-SQL)
MOVE CONVERSATION (Transact-SQL)
sys.iletişim_bitiş_noktaları (Transact-SQL)