我正在学习如何使用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.