2011-08-23 98 views
3

内执行我用下面的代码来设置僵局监测:msdb.dbo.sp_send_dbmail没有一个存储过程

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活化PROC [DBO] [。在队列Wayne.dbo.DeadLockNotificationsQueue上运行的usp_ProcessNotification]输出以下内容:'接收Service Broker消息FROM队列DeadLockNotificationsQueue时出错。 数据库名称:Wayne;错误编号:229;错误消息:EXECUTE权限在对象'sp_send_dbmail',数据库'msdb',模式'dbo'上被拒绝。

我也跑以下:

EXEC msdb.dbo.sp_addrolemember @rolename = 'DatabaseMailUserRole中' ,@成员名称= '';

与我的登录作为成员名,但它似乎没有帮助。

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

谢谢。

Wayne。

+1

这是关于激活过程正在运行的帐户。这需要发挥正确的作用。看到这篇文章http://rusanu.com/2006/01/12/why-does-feature-not-work-under-activation/ –

回答

5

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

ALTER DATABASE [Wayne] SET TRUSTWORTHY ON; 

前一种方法是复杂的,但在一个安全的环境是必须的。后面的方法要容易得多,但这意味着数据库的dbo可以将自己提升为系统管理员权限。如果安全问题不是问题,则可以使用更简单的TRUSTWORTHY方法。

+0

使用不需要值得信赖的选项。值得信赖的选项就像是说:“我信任此数据库中的所有当前*和将来*代码”。不是一个好地方。此外,签署存储过程和所有不*这*复杂。 –