数据库邮件的常见错误

适用于:SQL ServerAzure SQL 托管实例

本文介绍了数据库邮件可能遇到的一些常见错误及其解决方案。

若要在 SQL Server 实例上运行 T-SQL 命令,请使用 SQL Server Management Studio (SSMS)Visual Studio Code 的 MSSQL 扩展sqlcmd 或你喜欢的 T-SQL 查询工具。

找不到存储过程“sp_send_dbmail”

sp_send_dbmail存储过程安装在msdb数据库中。 必须从msdb数据库运行sp_send_dbmail,或指定存储过程的三段式名称。

示例:

EXEC msdb.dbo.sp_send_dbmail ...

或:

USE msdb;
GO
EXEC dbo.sp_send_dbmail ...

使用 “配置数据库邮件 ”来启用和配置数据库邮件。

配置文件无效

导致出现此消息的可能原因有两个。 指定的配置文件不存在,或者运行 sp_send_dbmail (Transact-SQL) 的用户无权访问配置文件。

要检查配置文件的权限,请使用配置文件名称运行存储过程 sysmail_help_principalprofile_sp (Transact-SQL)。 使用存储过程 sysmail_add_principalprofile_sp(Transact-SQL)配置数据库邮件来授予用户或用户组访问配置文件的权限 msdb

拒绝了针对 sp_send_dbmail 的权限

本文介绍如何排查错误消息,指出尝试发送数据库邮件的用户无权执行 sp_send_dbmail

错误文本如下:

EXECUTE permission denied on object 'sp_send_dbmail', 
database 'msdb', schema 'dbo'.

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

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

有关详细信息,请参阅 sp_addrolemembersp_droprolemember

数据库邮件已排队,但 sysmail_event_log 或 Windows 应用程序事件日志中没有任何项

数据库邮件使用 Service Broker 来对电子邮件进行排队。 如果数据库邮件已停止,或者如果数据库中未激活 msdb Service Broker 邮件传递,则数据库邮件会将数据库中的邮件排入队列,但无法传递消息。 在这种情况下,Service Broker 消息将保留在 Service Broker 邮件队列中。 Service Broker 不会激活外部程序,因此在sysmail_event_log中没有日志条目,并且在sysmail_allitems中以及相关视图中没有更新项目状态。

执行以下语句,检查是否在 msdb 数据库中启用了 Service Broker:

SELECT is_broker_enabled FROM sys.databases WHERE name = 'msdb';

0 的值表明 Service Broker 消息传递在msdb数据库中未激活。 要解决此问题,请使用以下 Transact-SQL 命令在数据库中激活 Service Broker:

USE master ;
GO

ALTER DATABASE msdb SET ENABLE_BROKER ;
GO

数据库邮件依赖于多个内部存储过程。 为了减少外围应用,在新安装的 SQL Server 中,这些存储过程是禁用的。 若要启用这些存储过程,请使用系统存储过程中的数据库邮件 XP(服务器配置选项),如以下示例所示:

EXEC sp_configure 'show advanced options', 1;  
RECONFIGURE;
EXEC sp_configure 'Database Mail XPs', 1;  
RECONFIGURE;
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE;
GO  

msdb数据库中的数据库邮件可能已停止。 要检查数据库邮件的状态,请执行执行以下语句:

EXECUTE dbo.sysmail_help_status_sp;

若要在邮件主机数据库中启动数据库邮件,请在 msdb 数据库中运行以下命令:

EXECUTE dbo.sysmail_start_sp;

激活 Service Broker 后,它将检查消息对话框生存期;因此,已处于 Service Broker 传递队列中的对话框生存期长于已配置的对话框生存期的任何消息将立即失败。 数据库邮件会在 sysmail_allitems 和相关视图中更新失败邮件的状态。 必须决定是否再次发送电子邮件。 有关配置数据库邮件使用的对话框生存期的详细信息,请参阅 sysmail_configure_sp

后续步骤