【问题标题】:SQL Service Broker - The server principal "sa" is not able to accessSQL Service Broker - 服务器主体“sa”无法访问
【发布时间】:2013-11-04 01:49:30
【问题描述】:

尝试从我的数据库发送消息时出现权限错误。

我启用 proker 服务:

-- Enable Broker on Initiator
ALTER DATABASE A-DB SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE A-DB SET ENABLE_BROKER;
ALTER AUTHORIZATION ON DATABASE::A-DB TO [sa];
ALTER DATABASE A-DB SET TRUSTWORTHY ON;
ALTER DATABASE A-DB SET MULTI_USER;
GO

然后我创建队列和所有这些......

当我尝试发送消息时,我在 sys.transmission_queue 中看到以下错误:

在目标队列中排队消息时发生异常。 错误:916,状态:3。服务器主体“sa”无法访问 当前安全上下文下的数据库“MYDBNAME”。

(其中 MYDBNAME 是我们正在使用的数据库的名称)

我认为错误是由这一行引起的:

将 DATABASE::A-DB 上的授权更改为 [sa];

这可能是件坏事。但是,我可以更改授权以将其恢复到原来的状态吗?我以为它会是“dbo”,但这是不对的。是否应该设置为谁创建了数据库?

【问题讨论】:

  • 对话是否跨数据库(一个数据库中的发起者,另一个数据库中的目标?如果是,如果EXECUTE AS USER 'dbo' 成功,您可以签入 other 数据库吗?我希望它失败,然后你需要ALTER AUTHORIZATION ON DATABASE::[MYDBNAME] TO [sa];
  • 我自己也遇到了同样的错误。在我的情况下,这两个服务都在同一个数据库中,但是在我的目标队列上激活的 sp 调用了一个错误,因为它包含对 [MYDBNAME] 的连接。运气好的话? Remus 的解决方案有效吗?

标签: sql-server service-broker


【解决方案1】:

异常 - 错误:916,状态:3。服务器主体“\”无法在当前安全上下文下访问数据库“”。

错误:916,状态:3。服务器主体“sa”无法在当前安全上下文下访问数据库“xxx”。

解决方案 - 执行“ALTER DATABASE ... SET TRUSTWORTHY ON”命令。 technet link

因为附加到 SQL Server 实例的数据库 不能立即信任,不允许数据库访问 超出数据库范围的资源,直到数据库 明确标记为值得信赖。

ALTER DATABASE MyDatabase SET TRUSTWORTHY ON

在我的例子中,启动器和目标服务都在同一个数据库中,但它是一个外部数据库的连接导致了这个错误。应该为启用了 Svc Broker 的数据库编写 Alter。

【讨论】:

  • 因为我使用 SSDT。我设置了“数据库设置”-“杂项”-“服务器代理选项:”EnableBroker
【解决方案2】:

因为数据库是服务器级对象,所以它需要由服务器级主体拥有。因此,您需要提供登录名才能拥有数据库。至于哪个登录名,我通常选择 sa,但它可以是您的登录名,也可以是任何其他人的登录名。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 2013-10-22
    相关资源
    最近更新 更多