我有一个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