Я изучаю, как использовать 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 ).
Следуя совету руководства, я загрузил пример базы данных AdventureWorks2008R2 _Data.mdf и скопировал ее в папку C :\Program Files\Microsoft SQL Server\MSSQL10 _50.SQL _PRIKRYL05\MSSQL\DATA. \AdventureWorks2008R2 _Data.mdf
Среду SQL Server Management Studio нужно было запускать «от имени администратора», чтобы позже можно было прикрепить данные. Затем я подключил SQL Server.
Щелкните правой кнопкой мыши Базы данных, контекстное меню Прикрепить..., кнопку Добавить..., указал на AdventureWorks2008R2 _Data.mdf + OK. Затем выберите файл AdventureWorks2008R2 _Log.ldf из сетки ниже (, отмеченный как «Не найдено» ), и нажмите кнопку «Удалить...». После нажатия OK база данных была присоединена, и автоматически был создан журнал AdventureWorks2008R2 _log.LDF.
Следующие запросы использовались для просмотра «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
.