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

Posted

技术标签:

【中文标题】msdb.dbo.sp_send_dbmail 不在存储过程中执行【英文标题】:msdb.dbo.sp_send_dbmail does not execute within a stored procedure 【发布时间】:2011-08-23 23:15:01 【问题描述】:

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

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] 输出以下内容:'从队列 DeadLockNotificationsQueue 接收 Service Broker 消息时出错。 数据库名称:韦恩;错误号:229;错误消息:对象“sp_send_dbmail”、数据库“msdb”、架构“dbo”的执行权限被拒绝。

我还运行了以下内容:

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

使用我的会员名登录,但似乎没有帮助。

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

谢谢。

韦恩。

【问题讨论】:

与运行激活程序的帐户有关。这需要扮演正确的角色。看这篇文章rusanu.com/2006/01/12/… 【参考方案1】:

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

ALTER DATABASE [Wayne] SET TRUSTWORTHY ON;

前一种方法比较复杂,但在安全环境中是必须的。后一种方法要容易得多,但它暗示Wayne 数据库的dbo 可以将自己提升到sysadmin 权限。如果安全问题不是问题,您可以使用更简单的 TRUSTWORTHY 方法。

【讨论】:

使用不需要信任的选项。值得信赖的选项就像说“我信任此数据库中所有当前的和未来代码”。不是一个好地方。此外,sproc 的签名过程和所有的事情并不复杂。【参考方案2】:

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

【讨论】:

以上是关于msdb.dbo.sp_send_dbmail 不在存储过程中执行的主要内容,如果未能解决你的问题,请参考以下文章

SSIS Send Mail

数据库邮件

数据库邮件

sqlserver数据库发送邮箱

数据库邮件

错误:注意:无法通过电子邮件通知“操作员”。当作业失败时尝试发送电子邮件