SQL Service Broker - 服务器主体“sa”无法访问

时间:2013-11-04 01:49:31

标签: sql-server service-broker

尝试从我的数据库发送邮件时收到权限错误。

我为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 TO [sa];

的授权

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

2 个答案:

答案 0 :(得分:6)

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

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

分辨率 - 执行'ALTER DATABASE ... SET TRUSTWORTHY ON'命令。 technet link

  

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

ALTER DATABASE MyDatabase SET TRUSTWORTHY ON

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

答案 1 :(得分:0)

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