我正在学习如何使用SQL Server 2008 R2的Service Broker的。 当下面的教程完成单个数据库中一个对话 。 继第1课 ,我已经成功地创建了消息类型,合同,队列和服务。 继第2课 ,我可能已经发送的消息。 然而,试图收到消息的时候,我得到空的ReceivedRequestMsg
而不是发送的内容。
当在看sys.transmission_queue
,该transmission_status
的消息称:
而在目标队列入队的消息时发生异常。 错误:15517,状态:1无法执行作为数据库主要因为主体“DBO”不存在,这种类型的主体不能被冒充,或者您没有权限。
我已经安装使用Windows登录SQL Server等Mycomp\Petr
。 我使用的登录也为教训。
你能猜出这是什么问题? 我应该怎么检查和或者设置为使其工作?
编辑2012/07/16:帮助重现该问题,这里是我做的。 你能重现错误,如果你按照下面的步骤是什么?
首先,我使用的是Windows 7 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和按下删除...按钮。 按下确定后,数据库附着和AdventureWorks2008R2_log.LDF自动创建。
下面的查询被用于寻找“启用的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
。