Почему инициализация сервиса не в кавычках, если целевой сервис? - PullRequest
1 голос
/ 18 февраля 2010

Я только что унаследовал базу данных SQL Server 2005, в которой используется сервисный брокер (это часть более крупного проекта / решения). Все в решении работает нормально. Я пытаюсь взломать сервисный брокер SQL и вижу это утверждение.

BEGIN DIALOG CONVERSATION @h
FROM SERVICE foo_Init
TO SERVICE 'foo_Target'
ON CONTRACT fooContract

Почему foo_Init не заключен в одинарные кавычки? Я ожидаю, что это так же, как 'foo_Target'.

Ответы [ 2 ]

2 голосов
/ 18 февраля 2010

FROM SERVICE должен быть сервисом в текущей базе данных, то есть чем-то, что вы можете получить прямо сейчас. Поэтому вы должны ссылаться на него по его системному имени. С другой стороны, для обслуживания это просто "что-то там". Он может даже не существовать, пока выполняется оператор BEGIN DIALOG. Когда необходимо отправить сообщение, маршруты Service Broker вступают в игру и сообщают Service Broker, где на самом деле находится это «что-то там» и как его достичь. Поэтому обращение к целевой службе по sysname (как это происходит со службой инициатора) будет иметь смысл только в том случае, если целевая служба находится в одной и той же базе данных, что может не всегда иметь место.

2 голосов
/ 18 февраля 2010

Из книг в сети

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

ИЗ СЕРВИСА инициатор_сервис_имя Определяет службу, которая инициирует диалог. Указанное имя должно быть именем службы в текущей базе данных. Очередь, указанная для службы инициатора, получает сообщения, возвращенные целевой службой, и сообщения, созданные компонентом Service Broker для этого диалога.

ДЛЯ ОБСЛУЖИВАНИЯ 'target_service_name' Определяет целевую службу, с которой следует начать диалог. Имя_целевого_службы имеет тип nvarchar (256). Компонент Service Broker использует побайтовое сравнение для сопоставления строки target_service_name. Другими словами, сравнение выполняется с учетом регистра и не учитывает текущую сортировку.

...