sql server 服务器之间传递消息,SQL Server 2008 Service Broker教程 - 无法接收消息(transmission_status中的异常)...

用户在尝试使用SQL Server 2008 R2的Service Broker时遇到问题,发送消息后无法在目标队列中接收到消息,而收到错误15517,提示“无法作为数据库主体执行”。用户已创建消息类型、合同、队列和服务,并遵循了一个教程。问题似乎与权限或模拟有关,可能涉及Windows登录和数据库主体设置。
摘要由CSDN通过智能技术生成

我正在学习如何使用SQL Server 2008 R2的Service Broker.在完成单个数据库中的完成对话教程时.在第1课之后,我成功创建了消息类型,合同,队列和服务.在第2课之后,我可能已经发送了这条消息.但是,在尝试接收消息时,我获取的是NULL ReceivedRequestMsg而不是发送的内容.

在查看时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,开发人员版,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.

右键单击Databases,上下文菜单Attach ...,按钮Add ...,指向AdventureWorks2008R2_Data.mdf + OK.然后从下面的网格中选择AdventureWorks2008R2_Log.ldf(报告为未找到)并按下删除...按钮.按OK后,附加了数据库并自动创建了AdventureWorks2008R2_log.LDF.

以下查询用于查看"Service Broker enabled/disabled",以及启用(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'Message for Target service.';

SEND ON CONVERSATION @InitDlgHandle

MESSAGE TYPE

[//AWDB/1DBSample/RequestMessage]

(@RequestMsg);

SELECT @RequestMsg AS SentRequestMsg;

COMMIT TRANSACTION;

GO

当在队列看时,Initiator...与Target...队列是空的,并且可见于所发送的消息sys.transmission_queue经由报告上述的错误transmission_status.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值