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

Way*_*yne 3 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 ='';

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

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

谢谢.

韦恩.

Rem*_*anu 5

Martin指出了正确的原因,即激活过程运行的EXECUTE AS上下文.您可以使用代码签名来授予所需的权限,如从激活的过程调用另一个数据库中的过程中所示.或者您可以简单地标记数据库Wayne 值得信赖:

ALTER DATABASE [Wayne] SET TRUSTWORTHY ON;
Run Code Online (Sandbox Code Playgroud)

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