Sql server Service Broker疑难解答:启动器数据库在转换时卡住/已通知
我们正在开发一个应用程序,它将使用ServiceBroker将消息从一个数据库传输到另一个数据库SourceDB由现有应用程序使用,我们正在从中提取一些数据TargetDB仅由此应用程序使用,并处理/分发我们需要的数据。我们只使用一种类型的契约,并且两个数据库都在同一台服务器上 我们在这两个队列上以及各自的启动器和目标队列/服务上设置了相同的消息类型和契约。在两个数据库上:Sql server Service Broker疑难解答:启动器数据库在转换时卡住/已通知,sql-server,sql-server-2005,service-broker,Sql Server,Sql Server 2005,Service Broker,我们正在开发一个应用程序,它将使用ServiceBroker将消息从一个数据库传输到另一个数据库SourceDB由现有应用程序使用,我们正在从中提取一些数据TargetDB仅由此应用程序使用,并处理/分发我们需要的数据。我们只使用一种类型的契约,并且两个数据库都在同一台服务器上 我们在这两个队列上以及各自的启动器和目标队列/服务上设置了相同的消息类型和契约。在两个数据库上: 启用代理已设置 可信已设置 拥有唯一的服务\u代理\u guid 将sa作为db所有者,所有SSB授权声明都是dbo或o
已设置启用代理
已设置可信
- 拥有唯一的
服务\u代理\u guid
- 将
作为db所有者,所有SSB授权声明都是sa
或dbo
,视情况而定owner
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);
……信息无法到达目的地。进一步调查显示:
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
- 启动器队列为空
- 目标队列为空(注意:这不是需要接收的问题)
- 传输队列为空
- SQL Server日志或创建消息的存储过程中的捕获错误处理中均未记录任何错误
- 如果启用激活,SourceDB的
中启动器队列的条目将设置为NOTIFIEDsys.dm\u broker\u queue\u monitors
- SourceDB的
在sys.conversation\u端点
状态中有一个新条目转换
- 如果启用激活,TargetDB的
sys.dm_broker_queue_监视器中的目标队列条目将保持非活动状态
- TargetDB的
在sys.conversation\u endpoints
状态中有一个新条目,与SourceDB条目具有相同的会话id和不同的会话句柄CONVERSING
ssbdiagnose-S testserver-d SourceDB配置从服务//服务/启动器到服务//服务/合同目标//合同/通知
这产生了以下结果:
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
确实存在,尽管存在于不同的数据库中。但我的同事运行了一个探查器跟踪,显示正在执行一个命令,查找SourceDB上的//Service/Target
。服务代理似乎不知怎么搞糊涂了。添加一条明确的路线,除了在理论上是不必要的之外,不会改变这种情况
我在我们的测试服务器上运行了一组几乎相同的,并且一切正常,所以它可能是特定于db的
我们的设置在两天前开始工作,因此我们可能正在寻找一些可能已更改但运气不佳的设置。您正在这样做吗?:@RemusRusanu,谢谢您的回复。即使确保我们没有运行任何
END CONVERSATION
语句,这种情况仍在发生。有一件事让我很清楚:SourceDB中的dbo对目标服务没有发送权限。谁是dbo SourceDB,该用户是否需要/拥有TargetDB中的PERM?我有点失望,SB仍然是一门神秘的艺术,而且还没有做更多的工作来让它变得更简单…@BenThul,sa是SourceDB和TargetDB的db所有者。绝对感受到你对SSB降级为arcana的评论的真实性。:)我的怀疑是:1)您有多个//Service/Target
服务副本(在多个数据库中),SSB从您期望的副本中选择了一个不同的副本;2)您有一个//Service/Target
的路由,该路由将消息发送到未预料到的某个地方。您这样做了吗?:@RemusRusanu,谢谢您的回复。即使确保我们没有运行任何END CONVERSATION
语句,这种情况仍在发生。有一件事让我很清楚:SourceDB中的dbo对目标服务没有发送权限。谁是dbo SourceDB,该用户是否需要/拥有TargetDB中的PERM?我有点失望,SB仍然是一门神秘的艺术,而且还没有做更多的工作来让它变得更简单…@BenThul,sa是SourceDB和TargetDB的db所有者。绝对感受到你对SSB降级为arcana的评论的真实性。:)我的怀疑是:1)您有多个//Service/Target
服务副本(在多个数据库中),SSB从您期望的副本中选择了一个不同的副本;2)您有一个//Service/Target
的路由,它将消息发送到意外的地方