数据库邮件的常见错误
适用于: SQL Server
Azure 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 数据库中的用户,并且是 msdb 数据库中的 DatabaseMailUserRole 数据库角色的成员。 要将 msdb 用户或组添加到此角色中,请使用 SQL Server Management Studio 或对需要发送数据库邮件的用户或角色执行以下语句。
EXEC msdb.dbo.sp_addrolemember @rolename = 'DatabaseMailUserRole'
,@membername = '<user or role name>';
GO
有关详细信息,请参阅 sp_addrolemember 和 sp_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 表示未在 msdb 数据库中激活 Service Broker 消息传递功能。 要解决此问题,请使用以下 Transact-SQL 命令在数据库中激活 Service Broker:
USE master ;
GO
ALTER DATABASE msdb SET ENABLE_BROKER ;
GO
数据库邮件依赖于多个内部存储过程。 为了减少外围应用,在新安装的 SQL Server 中,这些存储过程是禁用的。 要启用这些存储过程,请使用 sp_configure 系统存储过程的数据库邮件 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 (Transact-SQL)。