BEGIN DIALOG CONVERSATION (Transact-SQL)

開始服務之間的對話。對話是在兩個服務之間進行精確單次循序傳訊的交談。

主題連結圖示Transact-SQL 語法慣例

語法

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

引數

  • **@**dialog_handle
    這是一個變數,用來儲存 BEGIN DIALOG CONVERSATION 陳述式傳回的新對話之系統產生對話控制代碼。這個變數的類型必須是 uniqueidentifier
  • FROM SERVICE initiator_service_name
    指定起始對話的服務。指定的名稱必須是目前資料庫中服務的名稱。指定給起始端服務的佇列會接收目標服務傳回的訊息及 Service Broker 為了這項交談所建立的訊息。
  • TO SERVICE 'target_service_name'
    指定起始對話時所指向的目標服務。target_service_name 的類型是 nvarchar(256)。Service Broker 利用逐一比較位元組的方式來比對 target_service_name 字串。換言之,這項比較會區分大小寫,且不會考慮目前的定序。
  • service_broker_guid
    指定主控目標服務的資料庫。若有一個以上的資料庫主控目標服務的執行個體,您可以提供 service_broker_guid 來與特定資料庫通訊。

    service_broker_guid 的類型是 nvarchar(128)。若要尋找資料庫的 service_broker_guid,請在資料庫中執行下列查詢:

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

    如需有關 Service Broker 識別的詳細資訊,請參閱<管理 Service Broker 識別>。

  • 'CURRENT DATABASE'
    指定交談使用目前資料庫的 service_broker_guid
  • ON CONTRACT contract_name
    指定這項交談遵照的合約。合約必須在目前的資料庫中。如果目標服務不接受指定合約的新交談,Service Broker 會在交談上傳回錯誤訊息。當省略這個子句時,交談會遵照名稱為 DEFAULT 的合約。
  • RELATED_CONVERSATION **=**related_conversation_handle
    指定新對話要加入其中的現有交談群組。當出現這個子句時,新對話與 related_conversation_handle 指定的對話屬於同一個交談群組。related_conversation_handle 的類型必須可以隱含地轉換成 uniqueidentifier 類型。如果 related_conversation_handle 並未參考現有的對話,陳述式將會失敗。
  • RELATED_CONVERSATION_GROUP **=**related_conversation_group_id
    指定新對話要加入其中的現有交談群組。當出現這個子句時,新對話將會加入 related_conversation_group_id 指定的交談群組。related_conversation_group_id 的類型必須可以隱含地轉換成 uniqueidentifier 類型。如果 related_conversation_group_id 並未參考現有的交談群組,Service Broker 會利用指定的 related_conversation_group_id 來建立新交談群組,並使新對話與該交談群組產生關聯。
  • LIFETIME **=**dialog_lifetime
    指定對話維持開啟狀態的最大時間量。為了使對話順利完成,兩個端點必須在存留期間過期之前明確地結束對話。dialog_lifetime 值必須以秒為單位來表示。存留期間的類型是 int。當沒有指定 LIFETIME 子句時,對話存留期間是 int 資料類型的最大值。
  • ENCRYPTION
    指定當這個對話所傳送和接收的訊息在 Microsoft SQL Server 的執行個體之外傳送時,是否必須加密。必須加密的對話是*「安全的對話」*。當 ENCRYPTION = ON 且未設定支援加密所需要的憑證時,Service Broker 會在交談上傳回錯誤訊息。當 ENCRYPTION = OFF 時,如果設定 target_service_name 的遠端服務繫結,便會使用加密;否則,會以不加密的方式來傳送訊息。如果沒有這個子句,預設值便是 ON。如需有關對話安全性的詳細資訊,請參閱<Service Broker 對話安全性>。

    ms187377.note(zh-tw,SQL.90).gif附註:
    在 SQL Server 的相同執行個體中各項服務之間交換的訊息,絕對不會加密。不過,如果交談服務在不同資料庫中,使用加密的交談仍需要資料庫主要金鑰以及用於加密的憑證。如此一來,當進行交談時,如果其中一個資料庫移到不同的執行個體,仍可以繼續交談。

備註

所有訊息都是交談的一部份。因此,起始服務必須先開始一項與目標服務的交談,才能將訊息傳給目標服務。BEGIN DIALOG CONVERSATION 陳述式指定的資訊與郵件的地址相似;Service Broker 會利用這項資訊將訊息傳給正確的服務。TO SERVICE 子句指定的服務是訊息要送往的地址。FROM SERVICE 子句指定的服務是回覆訊息的傳回地址。

交談的目標不需要呼叫 BEGIN DIALOG CONVERSATION。當起始端所發出之交談中的第一則訊息抵達時,Service Broker 會在目標資料庫中建立一項交談。

開始對話,會在起始服務的資料庫中建立交談端點,但不會建立網路連接來通往主控目標服務的執行個體。傳送第一則訊息之後,Service Broker 才會與對話的目標建立通訊。

當 BEGIN DIALOG CONVERSATION 陳述式未指定相關交談或相關交談群組時,Service Broker 會為這項新交談建立一個新的交談群組。

Service Broker 不允許將交談任意分組。交談群組中的所有交談,都必須以 FROM 子句所指定的服務為交談的起始端或目標。

BEGIN DIALOG CONVERSATION 命令會鎖定包含所傳回之 dialog_handle 的交談群組。當命令包含 RELATED_CONVERSATION_GROUP 子句時,dialog_handle 的交談群組就是 related_conversation_group_id 參數所指定的交談群組。當命令包含 RELATED_CONVERSATION 子句時,dialog_handle 的交談群組就是與所指定之 related_conversation_handle 相關聯的交談群組。

在使用者自訂函數中,BEGIN DIALOG CONVERSATION 無效。

權限

若要開始一段對話,目前的使用者必須有命令的 FROM 子句所指定服務佇列的 RECEIVE 權限,以及指定合約的 REFERENCES 權限。

範例

A. 開始對話

下列範例會開始對話交談,並將對話的識別碼儲存在 @dialog_handle 中。//Adventure-Works.com/ExpenseClient 服務是對話的起始端,//Adventure-Works.com/Expenses 服務是對話的目標。對話遵照 //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. 開始含有明確存留期間的對話

下列範例會開始對話交談,並將對話的識別碼儲存在 @dialog_handle 中。//Adventure-Works.com/ExpenseClient 服務是對話的起始端,//Adventure-Works.com/Expenses 服務是對話的目標。對話遵照 //Adventure-Works.com/Expenses/ExpenseSubmission 合約。如果 END CONVERSATION 命令沒有在 60 秒內關閉對話,Broker 會結束對話並傳回錯誤。

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. 利用特定 Broker 執行個體來開始對話

下列範例會開始對話交談,並將對話的識別碼儲存在 @dialog_handle 中。//Adventure-Works.com/ExpenseClient 服務是對話的起始端,//Adventure-Works.com/Expenses 服務是對話的目標。對話遵照 //Adventure-Works.com/Expenses/ExpenseSubmission 合約。Broker 會將這個對話的訊息傳送給 GUID a326e034-d4cf-4e8b-8d98-4d7e1926c904. 所識別的 Broker。

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. 開始對話,將這段對話關聯於現有的交談群組

下列範例會開始對話交談,並將對話的識別碼儲存在 @dialog_handle 中。//Adventure-Works.com/ExpenseClient 服務是對話的起始端,//Adventure-Works.com/Expenses 服務是對話的目標。對話遵照 //Adventure-Works.com/Expenses/ExpenseSubmission 合約。Broker 會將對話關聯於 @conversation_group_id 所識別的交談群組,不會建立新的交談群組。

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. 開始含有明確存留期間的對話,並將這段對話關聯於現有的交談

下列範例會開始對話交談,並將對話的識別碼儲存在 @dialog_handle 中。//Adventure-Works.com/ExpenseClient 服務是對話的起始端,//Adventure-Works.com/Expenses 服務是對話的目標。對話遵照 //Adventure-Works.com/Expenses/ExpenseSubmission 合約。新對話與 @existing_conversation_handle 屬於相同的交談群組。如果 END CONVERSATION 命令沒有在 600 秒內關閉對話,Service Broker 會結束對話並傳回錯誤。

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. 利用選擇性的加密來開始對話

下列範例會開始對話,並將對話的識別碼儲存在 @dialog_handle 中。//Adventure-Works.com/ExpenseClient 服務是對話的起始端,//Adventure-Works.com/Expenses 服務是對話的目標。對話遵照 //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]
   WITH ENCRYPTION = OFF ;

請參閱

參考

BEGIN CONVERSATION TIMER (Transact-SQL)
END CONVERSATION (Transact-SQL)
MOVE CONVERSATION (Transact-SQL)
sys.conversation_endpoints (Transact-SQL)

其他資源

Service Broker 教學課程
交談群組
Conversation Group Locks
對話交談

說明及資訊

取得 SQL Server 2005 協助