SQL Server 2008 R2 の Service Broker の使用方法を学習しています。チュートリアルCompleting a Conversation in a Single Database に従う場合。レッスン 1に従って、メッセージ タイプ、コントラクト、キュー、およびサービスを正常に作成しました。レッスン 2に続いて、おそらくメッセージを送信しました。ただし、メッセージを受信しようとするとReceivedRequestMsg
、送信されたコンテンツの代わりに NULL が返されます。
を見るとsys.transmission_queue
、transmission_status
メッセージの は次のように述べています。
ターゲット キューにメッセージをエンキューしているときに例外が発生しました。エラー: 15517、状態: 1. データベース プリンシパルとして実行できません。プリンシパル "dbo" が存在しないか、このタイプのプリンシパルを偽装できないか、権限がないためです。
のような Windows ログインを使用して SQL Server をインストールしましたMycomp\Petr
。レッスンでもそのログインを使用しています。
何が問題なのか推測できますか? 動作させるには何を確認または設定する必要がありますか?
2012/07/16 編集:問題の再現を支援するために、私が行ったことを次に示します。次の手順を実行すると、エラーを再現できますか?
まず、Windows 7 Enterprise SP1 と Microsoft SQL Server 2008 R2、Developer Edition、64 ビット (ver. 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