3

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

http://weblogs.sqlteam.com/mladenp/archive/2008/07/18/Immediate-deadlock-notifications-without-changeing-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”的执行权限被拒绝。

我还运行了以下内容:

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

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

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

谢谢。

韦恩。

4

2 回答 2

5

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

ALTER DATABASE [Wayne] SET TRUSTWORTHY ON;

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

于 2011-08-24T00:34:38.243 回答
1

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

于 2012-12-01T04:29:29.607 回答