Sql 无法执行msdb.dbo.sp_send_dbmail

Sql 无法执行msdb.dbo.sp_send_dbmail,sql,sql-server,Sql,Sql Server,我得到这个错误: Msg 229,第14级,状态5,程序sp_send_dbmail,第1行 对对象“sp_send_dbmail”、数据库“msdb”、架构“dbo”的执行权限被拒绝 守则的有关部分: /****** Object: StoredProcedure [dbo].[dbo.STATUSCHANGE_EMAILALERT] ******/ EXEC msdb.dbo.sp_send_dbmail @recipients = 'Test@gmail.com', -- Grou

我得到这个错误:

Msg 229,第14级,状态5,程序sp_send_dbmail,第1行
对对象“sp_send_dbmail”、数据库“msdb”、架构“dbo”的执行权限被拒绝

守则的有关部分:

/****** 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';

向执行存储过程的用户授予对
sp\u send\u dbmail
的执行权限,或将其添加到角色
msdb中。要发送数据库邮件,用户必须是msdb数据库中的用户和msdb数据库中
数据库邮件用户角色的成员。要将msdb用户或组添加到此角色,请使用SQL Server Management Studio,或对需要发送数据库邮件的用户或角色执行以下语句:

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

找到了一个对我来说很好又简单的解决方案:

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

  • SQL MANAGEMENT STUDIO>管理>数据库邮件>右键单击并单击 选择配置…>选择管理配置文件安全性>SQL管理
  • 检查公共选择权
  • 单击默认配置文件并将其设置为“是”
  • STUDIO>数据库>系统数据库>右键单击MSDB并 选择新建查询>然后输入>在sp\u发送\u dbmail时授权执行到 公开,然后单击“确定”

  • 好的,只是补充一下这个话题,因为这是非常好的信息,但仍然没有完全解决我的问题。如果I在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不匹配相关的问题。因此,我必须为正在运行的数据库启用Trustely,并修复所有权问题:

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

    我不得不进行了大量的搜索,最终找到了更具启发性的方法。

    我意外地将SQL代理作业的“运行方式”选项-步骤从“[User]”更改为“(未指定)”。这导致我的作业开始工作。

    错误告诉您没有访问
    sp\u send\u dbmail
    存储过程的权限。你需要被授予执行
    的权限我发现:我认为不仅仅是权限,还有一点涉及,我知道更多后会在这里发布。谢谢你的评论。你注意到我的剧本中有什么可以改进的地方吗?