无法执行msdb.dbo.sp_send_dbmail

时间:2012-09-14 12:58:04

标签: sql sql-server

我收到此错误:

  

Msg 229,Level 14,State 5,Procedure sp_send_dbmail,Line 1
  对象' sp_send_dbmail',数据库' msdb',架构' dbo'上的EXECUTE权限被拒绝。

代码的相关部分:

/****** Object:  StoredProcedure [dbo].[dbo.STATUSCHANGE_EMAILALERT] ******/

EXEC msdb.dbo.sp_send_dbmail
  @recipients = 'Test@gmail.com', -- Group Email
  @subject = 'Employee Status Update',
  @profile_name ='Test@gmail.com', -- Setup the profile name group
  @body = @body,
  @body_format = 'HTML';

5 个答案:

答案 0 :(得分:10)

要发送数据库邮件,用户必须是msdb数据库中的用户,并且是msdb数据库中DatabaseMailUserRole数据库角色的成员。要将msdb用户或组添加到此角色,请使用SQL Server Management Studio或对需要发送数据库邮件的用户或角色执行以下语句:

EXEC msdb.dbo.sp_addrolemember @rolename = 'DatabaseMailUserRole'
    ,@membername = '<user or role name>';
GO

答案 1 :(得分:9)

找到了适合我more information about CDI的好的简单修复:

如果您的SQL应用程序无法使用数据库邮件发送电子邮件(我假设您已经有DBMail帐户和配置文件设置),则有两件事要设置:

  1. SQL管理工作室&gt;管理&gt;数据库邮件&gt;右键单击和 选择配置...&gt;选择管理简档安全&gt; SQL管理
  2. 检查PUBLIC选项
  3. 点击DEFAULT PROFILE并将其设为YES
  4. STUDIO&gt;数据库&gt;系统数据库&gt;右键单击MSDB和 选择NEW QUERY&gt;然后输入&gt;授予sp_send_dbmail执行权限 公开并单击确定

答案 2 :(得分:2)

sp_send_dbmail的执行权限授予执行存储过程的用户,或将其添加到角色msdb.DatabaseMailUser

答案 3 :(得分:0)

好的,只是添加到该主题,因为这确实是很好的信息,但仍不能完全解决我的问题。如果在SSMS中运行查询,则一旦我被授予在msdb中执行sp_send_dbmail过程的权限,该查询就会起作用。但是,当以我的用户身份运行作业时,它会仍然失败。

通读大量内容,得出结论,您需要确保数据库中所有者的sid与主数据库中的所有者sid相匹配:

--To get owner SID recorded in the master database for the current database
SELECT owner_sid FROM sys.databases WHERE database_id=DB_ID()
--To get the owner SID recorded for the current database owner
SELECT sid FROM sys.database_principals WHERE name=N'dbo'

即使我已授予对msdb的访问权限和对sp_send_dbmail的执行权限,它仍然存在与数据库不可信任以及所有者sid不匹配有关的问题。因此,我必须使用Trustworthy来运行数据库,并解决所有权问题:

ALTER DATABASE my_db SET TRUSTWORTHY ON;

ALTER AUTHORIZATION ON Database::my_db TO [domain\user];

我不得不经过大量的研究,终于找到了这个write-up,它更具启发性。

答案 4 :(得分:0)

我不小心将SQL Agent作业的“运行方式”选项从“ [用户]”更改为“(未指定)”。那导致我的工作开始工作。