21

我收到此错误:

消息 229,级别 14,状态 5,过程 sp_send_dbmail,第 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';
4

5 回答 5

21

在这里找到了对我有用的好而简单的修复:

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

  1. SQL MANAGEMENT STUDIO > MANAGEMENT > DATABASE MAIL > 右键单击​​并选择 CONFIGURE... > 选择 MANAGE PROFILE SECURITY > SQL MANAGEMENT
  2. 检查 PUBLIC 选项
  3. 单击默认配置文件并将其设置为是
  4. STUDIO > DATABASES > SYSTEM DATABASES > 右键单击​​ MSDB 并选择 NEW QUERY > 然后输入 > 将 sp_send_dbmail 上的执行权限授予 public 并单击 OK
于 2016-12-16T01:41:41.487 回答
17

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

EXEC msdb.dbo.sp_addrolemember @rolename = 'DatabaseMailUserRole'
    ,@membername = '<user or role name>';
GO
于 2012-09-14T13:02:17.207 回答
3

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

于 2012-09-14T13:00:27.187 回答
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];

我不得不经过大量的搜寻才能最终找到这篇更具启发性的文章。

于 2019-08-21T20:18:31.530 回答
0

我不小心更改了 SQL 代理作业的“运行方式”选项 - 从“[用户]”步骤到“(未指定)”。这导致我的工作开始工作。

于 2020-03-04T21:02:09.020 回答