我收到此错误:
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';
答案 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帐户和配置文件设置),则有两件事要设置:
答案 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作业的“运行方式”选项从“ [用户]”更改为“(未指定)”。那导致我的工作开始工作。