Учебник по SQL Server 2008 Service Broker — невозможно получить сообщение (исключение при передаче _статус)

Я изучаю, как использовать Service Broker SQL Server 2008 R2. При следовании руководству Завершение диалога в отдельной базе данных . Следуя Уроку 1 , я успешно создал типы сообщений, контракты, очереди и сервисы. Следуя Уроку 2 , я, вероятно, отправил сообщение. Однако при попытке получить сообщение я получаю NULL для ReceivedRequestMsgвместо отправленного содержимого.

Глядя на sys.transmission_queue, transmission_statusдля сообщения говорит:

An exception occurred while enqueueing a message in the target queue. Error: 15517, State: 1. Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.

Я установил SQL Server, используя логин Windows, например Mycomp\Petr. Я использую этот логин и для уроков.

Можете ли вы догадаться, в чем проблема? Что я должен проверить и / или установить, чтобы он работал?

Отредактировано 16.07.2012:Чтобы помочь воспроизвести проблему, вот что я сделал.Сможете ли вы воспроизвести ошибку, если выполните следующие шаги?

Во-первых, я использую Windows 7 Enterprise SP1 и Microsoft SQL Server 2008 R2, Developer Edition, 64 -бит (вер. 10.50.2500.0, корневой каталог, расположенный по адресу C :\Program Files\Microsoft SQL Server\MSSQL10 _50.SQL _PRIKRYL05\MSSQL ).

  1. Следуя совету руководства, я загрузил пример базы данных AdventureWorks2008R2 _Data.mdf и скопировал ее в папку C :\Program Files\Microsoft SQL Server\MSSQL10 _50.SQL _PRIKRYL05\MSSQL\DATA. \AdventureWorks2008R2 _Data.mdf

  2. Среду SQL Server Management Studio нужно было запускать «от имени администратора», чтобы позже можно было прикрепить данные. Затем я подключил SQL Server.

  3. Щелкните правой кнопкой мыши Базы данных, контекстное меню Прикрепить..., кнопку Добавить..., указал на AdventureWorks2008R2 _Data.mdf + OK. Затем выберите файл AdventureWorks2008R2 _Log.ldf из сетки ниже (, отмеченный как «Не найдено» ), и нажмите кнопку «Удалить...». После нажатия OK база данных была присоединена, и автоматически был создан журнал AdventureWorks2008R2 _log.LDF.

  4. Следующие запросы использовались для просмотра «Service Broker включен/отключен» и для включения (Service Broker был успешно включен для базы данных):


USE master;
GO

SELECT name, is_broker_enabled FROM sys.databases;
GO

ALTER DATABASE AdventureWorks2008R2
      SET ENABLE_BROKER
      WITH ROLLBACK IMMEDIATE;
GO

SELECT name, is_broker_enabled FROM sys.databases;
GO
  • Затем в соответствии с руководством были выполнены приведенные ниже запросы для создания типов сообщений, контракта, очередей и служб :

USE AdventureWorks2008R2;
GO

CREATE MESSAGE TYPE
       [//AWDB/1DBSample/RequestMessage]
       VALIDATION = WELL_FORMED_XML;
CREATE MESSAGE TYPE
       [//AWDB/1DBSample/ReplyMessage]
       VALIDATION = WELL_FORMED_XML;
GO

CREATE CONTRACT [//AWDB/1DBSample/SampleContract]
      ([//AWDB/1DBSample/RequestMessage]
       SENT BY INITIATOR,
       [//AWDB/1DBSample/ReplyMessage]
       SENT BY TARGET
      );
GO

CREATE QUEUE TargetQueue1DB;

CREATE SERVICE
       [//AWDB/1DBSample/TargetService]
       ON QUEUE TargetQueue1DB
       ([//AWDB/1DBSample/SampleContract]);
GO

CREATE QUEUE InitiatorQueue1DB;

CREATE SERVICE
       [//AWDB/1DBSample/InitiatorService]
       ON QUEUE InitiatorQueue1DB;
GO

. Все идет нормально.

  • Затем используются следующие запросы для просмотра очередей (, ставших пустыми при использовании):

USE AdventureWorks2008R2;
GO

SELECT * FROM InitiatorQueue1DB WITH (NOLOCK);
SELECT * FROM TargetQueue1DB WITH (NOLOCK);
SELECT * FROM sys.transmission_queue;
GO
  • Проблема проявляется при отправке сообщения:

BEGIN TRANSACTION;

BEGIN DIALOG @InitDlgHandle
     FROM SERVICE
      [//AWDB/1DBSample/InitiatorService]
     TO SERVICE
      N'//AWDB/1DBSample/TargetService'
     ON CONTRACT
      [//AWDB/1DBSample/SampleContract]
     WITH
         ENCRYPTION = OFF;

SELECT @RequestMsg =
       N'<RequestMsg>Message for Target service.</RequestMsg>';

SEND ON CONVERSATION @InitDlgHandle
     MESSAGE TYPE 
     [//AWDB/1DBSample/RequestMessage]
     (@RequestMsg);

SELECT @RequestMsg AS SentRequestMsg;

COMMIT TRANSACTION;
GO  

При просмотре очередей очереди Initiator...и Target...пусты, а отправленное сообщение можно найти в sys.transmission_queueс вышеупомянутой ошибкой, о которой сообщается через transmission_status.

23
задан pepr 16 July 2012 в 10:03
поделиться