gpt4 book ai didi

sql-server-2008-r2 - SQL Server 2008 Service Broker 教程——无法接收消息(transmission_status 中的异常)

转载 作者:行者123 更新时间:2023-12-03 11:07:15 24 4
gpt4 key购买 nike

我正在学习如何使用 SQL Server 2008 R2 的 Service Broker。遵循教程时 Completing a Conversation in a Single Database .关注 Lesson 1 ,我已经成功创建了消息类型、契约(Contract)、队列和服务。关注 Lesson 2 ,我可能已经发送了消息。但是,在尝试接收消息时,我得到了 ReceivedRequestMsg 的 NULL而不是发送的内容。

当看sys.transmission_queue , transmission_status因为消息说:

An exception occurred while enqueueing a message in the target queue. Error: 15517, State: 1. Cannot execute as the database principal because the principal "dbo" does not exist, this type of principal cannot be impersonated, or you do not have permission.



我已经使用 Windows 登录安装了 SQL Server,例如 Mycomp\Petr .我也在类(class)中使用该登录名。

你能猜出是什么问题吗?我应该检查什么或设置什么才能使它工作?

2012/07/16 编辑:为了帮助重现问题,这就是我所做的。如果您按照以下步骤操作,您能否重现该错误?

首先,我使用的是 Windows 7 Enterprise SP1 和 Microsoft SQL Server 2008 R2,Developer Edition,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 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
  • 然后,按照教程,执行以下查询以创建消息类型、契约(Contract)、队列和服务:

  • 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 报告了上述错误.

    最佳答案

    alter authorization on database::[<your_SSB_DB>] to [sa];

    EXECUTE AS 基础架构需要 dbo映射到有效的登录。 Service Broker 使用 EXECUTE AS 基础结构来传递消息。遇到此问题的典型场景是在家工作时使用公司笔记本电脑。您使用缓存凭据登录到膝上型计算机,然后使用相同的 Windows 缓存凭据登录到 SQL。您发出 CREATE DATABASEdbo映射到您的公司域帐户。但是,EXECUTE AS 基础结构不能使用 Windows 缓存帐户,它需要直接连接到 Active Directory。令人抓狂的部分是第二天在办公室一切正常(您的笔记本电脑再次进入公司网络并且可以访问 AD...)。你晚上回家,继续第 3 课......突然之间它不再起作用了。让整个事情看起来脆弱和不可靠。只是需要AD连接的事实......

    导致相同问题的另一种情况是由于数据库在还原或附加时保留其创建者的 SID(发出 CREATE DATABASE 的 Windows 登录名)这一事实引起的。如果您使用的是本地帐户 PC1\Fred当您创建数据库然后将数据库复制/附加到 PC2 时,该帐户在 PC2 上无效(当然,它的范围是 PC1)。同样,影响不大,但 EXECUTE AS 受到影响,这会导致 Service Broker 给出您看到的错误。

    最后一个例子是当 DB 由后来离开公司的用户创建并且 AD 帐户被删除时。看起来像是在报复他,但他是无辜的。生产数据库停止工作,仅仅是因为 dbo 是他的 SID。 map 也是。乐趣...

    只需更改 dbosa登录后,您修复整个 EXECUTE AS 事物,所有依赖于它的事件部件(SSB 可能是最大的依赖项)开始工作。

    关于sql-server-2008-r2 - SQL Server 2008 Service Broker 教程——无法接收消息(transmission_status 中的异常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11383145/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com