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

标签 sql-server sql-server-2005 service-broker

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

http://weblogs.sqlteam.com/mladenp/archive/2008/07/18/Immediate-deadlock-notifications-without-changing-existing-code.aspx

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

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

我还运行了以下命令:

执行 msdb.dbo.sp_addrolemember @rolename = 'DatabaseMailUserRole' ,@成员(member)名 = '';

用我的登录名作为成员(member)名,但似乎没有帮助。

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

谢谢。

韦恩。

最佳答案

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 方法。

关于sql-server - msdb.dbo.sp_send_dbmail 不在存储过程中执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7168648/

相关文章:

sql - 创建单个或多个 SQL 连接以多次执行相同的查询更好吗?

分组、平均的SQL子查询问题

database - 验证完整数据库备份 "WITH CHECKSUM"

c# - 我可以将 SqlDependency 与多个监听器/负载平衡一起使用吗

sql - 对 Service Broker 的性能影响 WAITFOR RECEIVE with no TIMEOUT

SQL 比较两列并覆盖值以跟踪最大值

mysql - 如何使用 where 子句从两个表中选择全部

sql-server - SQL 2005无法删除用户

service-broker - Service Broker 应用程序队列禁用事件

c# - 如何防止向 SQL Server 表中插入重复数据?