msdb.dbo.sp_send_dbmail不在存储过程中执行

时间:2011-08-23 23:15:02

标签: sql-server sql-server-2005 service-broker

我使用以下代码设置死锁监控:

http://weblogs.sqlteam.com/mladenp/archive/2008/07/18/Immediate-deadlock-notifications-without-changing-existing-code.aspx

它工作正常。 我遇到的问题是msdb.dbo.sp_send_dbmail似乎不起作用。 如果我从我的会话中手动执行,它工作正常,但是从存储过程中,会发生以下错误:

2011-08-23 16:42:45.28 spid219s在队列Wayne.dbo.DeadLockNotificationsQueue上运行的激活proc [dbo]。[usp_ProcessNotification]输出以下内容:'错误WHILE接收Service Broker消息FROM队列DeadLockNotificationsQueue。                         数据库名称:韦恩;错误号码:229;错误消息:对象'sp_send_dbmail',数据库'msdb',架构'dbo'上的EXECUTE权限被拒绝。'

我还运行了以下内容:

EXEC msdb.dbo.sp_addrolemember @rolename ='DatabaseMailUserRole'     ,@ membername ='';

以我的登录作为会员名称,但似乎没有帮助。

我需要做些什么来纠正这个问题?

感谢。

韦恩。

2 个答案:

答案 0 :(得分:5)

Martin指出了正确的原因,即激活过程运行的EXECUTE AS上下文。您可以使用代码签名来授予所需权限,如Call a procedure in another database from an activated procedure中所示。或者您只需标记数据库Wayne trustworthy

ALTER DATABASE [Wayne] SET TRUSTWORTHY ON;

前一种方法很复杂,但在安全的环境中是必须的。后一种方法要容易得多,但它意味着Wayne数据库的dbo可以将自己升级为sysadmin权限。如果不担心安全问题,可以使用更简单的TRUSTWORTHY方法。

答案 1 :(得分:1)

您可以在msdb中创建一个调用sp_send_dbmail的过程,然后按照gbn:How to execute sp_send_dbmail while limiting permissions的建议,在调用过程中将执行权授予public。不需要将用户添加到msdb以运行该过程。显然,这允许任何人根据程序逻辑发送邮件。