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

Sql server msdb.dbo.sp_send_dbmail不在存储过程中执行,sql-server,sql-server-2005,service-broker,Sql Server,Sql Server 2005,Service Broker,我使用以下代码设置死锁监视: 而且效果很好。 我的问题是msdb.dbo.sp_send_dbmail似乎不起作用。 如果从会话手动执行,工作正常,但从存储过程内部执行时,会发生以下错误: 2011-08-23 16:42:45.28 spid219s在队列Wayne.dbo.DeadLockNotificationsQueue上运行的激活进程[dbo].[usp_ProcessNotification]输出以下内容:“从队列DeadLockNotificationsQueue接收Servic

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

而且效果很好。 我的问题是msdb.dbo.sp_send_dbmail似乎不起作用。 如果从会话手动执行,工作正常,但从存储过程内部执行时,会发生以下错误:

2011-08-23 16:42:45.28 spid219s在队列Wayne.dbo.DeadLockNotificationsQueue上运行的激活进程[dbo].[usp_ProcessNotification]输出以下内容:“从队列DeadLockNotificationsQueue接收Service Broker消息时出错。”。 数据库名称:Wayne;错误号码:229;错误消息:对对象“sp_send_dbmail”、数据库“msdb”、架构“dbo”的执行权限被拒绝

我还运行了以下程序:

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

以我的登录名作为membername,但似乎没有帮助

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

谢谢


Wayne.

Martin指出了正确的原因,即激活的过程运行的执行方式上下文。您可以使用代码签名授予所需的权限,如中所示。或者,您可以简单地标记数据库
Wayne


前一种方法比较复杂,但在安全环境中是必须的。后一种方法更简单,但它意味着
Wayne
数据库的dbo可以将自己升级为系统管理员权限。如果不考虑安全问题,您可以使用更简单的可信方法。

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

这与激活过程所使用的帐户有关。这需要扮演正确的角色。请参阅本文,使用不需要可信的选项。值得信赖的选项就像说“我信任此数据库中所有当前和未来的代码”。这不是个好地方。此外,签署狂欢节的程序以及其他一切都没有那么复杂。
ALTER DATABASE [Wayne] SET TRUSTWORTHY ON;