我正在学习如何使用 SQL Server 2008 R2 的 Service Broker。按照教程在单个数据库中完成对话时。按照第 1 课,我成功地创建了消息类型、合同、队列和服务。在第 2 课之后,我可能已经发送了消息。但是,当尝试接收消息时,我得到的是 NULLReceivedRequestMsg
而不是发送的内容。
在查看 时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。
右键单击数据库,上下文菜单附加...,按钮添加...,指向 AdventureWorks2008R2_Data.mdf + OK。然后从下面的网格中选择 AdventureWorks2008R2_Log.ldf(报告为 Not found)并按下 Remove... 按钮。按 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
.