首页 > 解决方案 > 从执行上下文中的存储过程调用 sp_send_dbmail

问题描述

使用 SQL-Server 2019;我正在尝试使用 sp_send_dbmail 并已成功从 SQL-Server 发送测试电子邮件,因此请相信配置很好。

sproc 在 SQL-Login 的执行上下文中运行,它更新数据库中的一些表,然后调用下面应该通过 msdb.dbo.sp_send_dbmail 发送电子邮件的 sproc。

CREATE PROCEDURE [dbo].[sp_SendEmail]
    @emailAddress   AS NVARCHAR(MAX),
    @emailBody      AS NVARCHAR(MAX),
    @emailSubject   AS NVARCHAR(150),
    @attachmentPath AS NVARCHAR(255) = NULL,
    @emailId        AS INT OUTPUT
WITH EXECUTE AS N'Bob'
AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @bSuccess AS INT = 0;

    EXECUTE @bSuccess = [msdb].[dbo].[sp_send_dbmail]
       @profile_name     = N'Profile',
       @recipients       = @emailAddress,
       @subject          = @emailSubject,
       @body             = @emailBody,
       @body_format      = N'HTML',
       @importance       = N'High',
       @file_attachments = @attachmentPath,
       @mailitem_id      = @emailId OUTPUT;
    
    RETURN @bSuccess;
END
GO

当我运行存储过程时,我得到了错误:

消息 229,级别 14,状态 5,过程 msdb.dbo.sp_send_dbmail,第 1 行 [批处理开始第 2 行] 对象“sp_send_dbmail”、数据库“msdb”、架构“dbo”的执行权限被拒绝。

SQL-Login Bob 使用默认架构具有到 msdb 数据库的用户映射,并且是 DatabaseMailUserRole 角色的成员。

我已授予 Bob sp_send_dbmail securable 的执行权限,这似乎与 DatabaseMailUserRole 提供的内容重复,但仍然出现上述错误。

我很感激你能给我的任何见解。

标签: sql-serverstored-proceduressp-send-dbmail

解决方案


推荐阅读