小编Nat*_*han的帖子

在服务代理中时不能使用 msdb.dbo.sp_send_dbmail - 作为来宾执行?

我有一个TheNotificationProcedure对 msdb.dbo.sp_send_dbmail 进行跨数据库调用的过程。

它从服务代理队列中(间接地)调用:

CREATE QUEUE [Blah].[TheQueue]
WITH ACTIVATION (STATUS = ON, PROCEDURE_NAME = [Blah].[TheQueueProcedure], 
MAX_QUEUE_READERS = 1, EXECUTE AS N'TheUser');
Run Code Online (Sandbox Code Playgroud)

TheQueueProcedure 最终打电话 TheNotificationProcedure

如果我在 SSMS 中连接TheUser并执行TheNotificationProcedure,则一切正常,电子邮件会发送出去。

但是,当TheNotificationProcedure由于消息到达队列而被调用时,由于无法访问 msdb 过程而失败。

我已经尝试了所有我能想到的方法,包括在 msdb 中创建我自己的程序来包装 sp_send_dbmail 并签署我的 dbmail 包装器和TheNotificationProcedure相同的证书,并确保 msdb 中的证书用户是“DatabaseMailUserRole”的成员。

最后,在做了许多更详细的跟踪之后,我最终注意到了以下几点:

服务代理跟踪

也就是说,即使服务经纪人下执行登录TheUser,由于某种原因,它是数据库下执行用户guest,我怀疑至少部分地解释了我的权限问题。

登录 TheUser也映射到一个用户在MSDB叫TheUser-它肯定是不映射到来宾。

那么为什么它在通过服务代理时在 msdb 中作为来宾执行呢?

我需要避免将数据库标记为Trustworthy. 我希望通过签署程序(例如http://www.sommarskog.se/grantperm.html)我可以获得跨数据库传输的权限 - 是否execute as …

sql-server permissions sql-server-2008-r2 service-broker signature

5
推荐指数
1
解决办法
2103
查看次数