Service Broker を使用して、あるデータベースから別のデータベースにメッセージを転送するアプリケーションを開発しています。 SourceDBは、一部のデータを吸い上げている既存のアプリケーションによって使用されます。 TargetDBはこのアプリケーションでのみ使用され、必要なデータを処理/配布します。1 種類の契約のみを使用しており、両方の DB が同じサーバー上にあります。
両方、およびそれぞれのイニシエーターとターゲット キュー/サービスで同一のメッセージ タイプとコントラクトを設定しました。両方のデータベースで:
ENABLE_BROKER
設定されていますTRUSTWORTHY
設定されています- ユニークな
service_broker_guid
- データベースの所有者として、必要に応じ
sa
て、すべての SSB 承認ステートメントがdbo
またはである。OWNER
ただし、SourceDB からメッセージを送信すると、次のようになります。
BEGIN DIALOG CONVERSATION @dialogHandle
FROM SERVICE [//Service/Initiator]
TO SERVICE N'//Service/Target'
ON CONTRACT [//Contract/Notification]
WITH ENCRYPTION = OFF;
SEND ON CONVERSATION @dialogHandle
MESSAGE TYPE [//Message/Notification] (@RequestMsg);
...メッセージはそこに届きません。さらに調査すると、次のことがわかります。
- イニシエータ キューが空です
- ターゲット キューが空です (注: 必要があるという問題ではありません
RECEIVE
) - 伝送キューが空です
- SQL Server ログにも、メッセージを作成するストアド プロシージャの CATCH エラー処理にも、エラーは記録されません。
sys.dm_broker_queue_monitors
アクティブ化が有効になっている場合、SourceDB のイニシエーター キューのエントリは NOTIFIEDに設定されます。- SourceDB の状態
sys.conversation_endpoints
に新しいエントリがありますCONVERSING
sys.dm_broker_queue_monitors
アクティブ化が有効になっている場合、TargetDB のターゲット キューのエントリは INACTIVE のままです。- TargetDBには、 SourceDB のエントリと同じ conversation_id と異なる conversation_handle を持つ状態
sys.conversation_endpoints
の新しいエントリがありますCONVERSING
テスト データベースは SQL 2005 (アプリケーションは 2005 をサポートする必要があります) ですが、開発マシンの 2008 インストールから ssbdiagnose ユーティリティを実行して問題を診断しました。
ssbdiagnose -S testserver -d SourceDB CONFIGURATION FROM SERVICE //Service/Initiator TO SERVICE //Service/Target ON CONTRACT //Contract/Notification
それは以下を生み出しました:
D 29912 dbtestsvr SourceDB Service //Service/Target was not found
D 29975 dbtestsvr SourceDB User dbo does not have SEND permission on service //Service/Target
これは混乱を招きます。これは、dbo
アクセス権を拒否するべきではなく//Service/Target
、別のデータベースではあるものの、確かに存在するためです。//Service/Target
しかし、私の同僚は、 SourceDBを探してコマンドが実行されていることを示す Profiler トレースを実行しました。Service Broker はどうやら混乱しているようです。理論的に不要であることに加えて、明示的なルートを追加しても状況は変わりません。
テストサーバーでほぼ同じ一連のチュートリアルコマンドを実行しましたが、すべて正常に機能したため、db 固有のものである可能性があります。
私たちのセットアップは 2 日前に機能していたので、おそらく変更された可能性のある設定を探していますが、うまくいきません。