我使用以下代码设置死锁监控:
它工作正常。 我遇到的问题是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 ='';
以我的登录作为会员名称,但似乎没有帮助。
我需要做些什么来纠正这个问题?
感谢。
韦恩。
答案 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以运行该过程。显然,这允许任何人根据程序逻辑发送邮件。