共用方式為


使用 Database Mail 的常見錯誤

適用於:SQL ServerAzure SQL 受控執行個體

本文描述使用 Database Mail 及其解決方案時會發生的一些常見錯誤。

若要在 SQL Server 實例上執行 T-SQL 命令,請使用 SQL Server Management Studio (SSMS)、Visual Studio Code、sqlcmd 或您最愛的 T-SQL 查詢工具的 MSSQL 擴充功能。

找不到預存程序 'sp_send_dbmail'

sp_send_dbmail預存程式會安裝在 msdb 資料庫中。 您必須從sp_send_dbmail資料庫執行msdb,或指定預存程式的三部分名稱。

範例:

EXEC msdb.dbo.sp_send_dbmail ...

或:

USE msdb;
GO
EXEC dbo.sp_send_dbmail ...

使用 [設定資料庫郵件 ] 來啟用及設定 database mail。

設定檔無效

此訊息有兩個可能原因。 指定的設定檔不存在,或執行 sp_send_dbmail (Transact-SQL) 的使用者無權存取設定檔。

若要檢查設定檔的權限,請使用設定檔名稱執行預存程序 sysmail_help_principalprofile_sp (Transact-SQL)。 使用預存程式 sysmail_add_principalprofile_sp (Transact-SQL) 或 [ 設定資料庫郵件 ] 來授與使用者或群組存取設定檔的許可權 msdb

sp_send_dbmail 拒絕權限

本文說明如何針對錯誤訊息進行疑難解答,指出嘗試傳送 Database Mail 的使用者沒有執行許可權 sp_send_dbmail

錯誤文字是:

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

若要傳送 Database mail,用戶必須是資料庫中的使用者 msdb ,以及資料庫中 DatabaseMailUserRole 資料庫角色 msdb 的成員。 若要將 msdb 使用者或群組新增至此角色,請使用 SQL Server Management Studio 或對需要傳送 Database Mail 的使用者或角色執行下列陳述式。

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

如需詳細資訊,請參閱 sp_addrolemembersp_droprolemember

Database Mail 已排入佇列,sysmail_event_log 或 Windows 應用程式事件記錄檔中沒有項目

Database Mail 依賴 Service Broker 佇列電子郵件訊息。 如果 Database Mail 已停止,或未在 msdb 資料庫中啟用 Service Broker 訊息傳遞,Database Mail 會將資料庫中的訊息排入佇列,但無法傳遞訊息。 在此情況下,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

Database Mail 仰賴許多內部預存程序。 為降低介面區,安裝新的 SQL Server 時會停用這些預存程序。 若要啟用這些預存程式,請使用系統預存程式的 Database Mail XPs (伺服器組態選項),sp_configure如下列範例所示:

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 資料庫中,Database Mail 可能會停止。 若要檢查 Database Mail 的狀態,請執行下列陳述式:

EXECUTE dbo.sysmail_help_status_sp;

若要在郵件主資料庫中啟動 Database Mail,請在資料庫中執行下列命令 msdb

EXECUTE dbo.sysmail_start_sp;

Service Broker 會在啟動時檢查訊息的對話存留時間,因此任何已在 Service Broker 傳輸佇列的訊息,只要其存留時間比設定的對話存留時間還要長,就會立即失敗。 Database Mail 會更新 sysmail_allitems 與相關檢視中的失敗訊息狀態。 您必須判斷是否再次傳送電子郵件訊息。 如需設定 Database Mail 所使用之對話框存留期的詳細資訊,請參閱 sysmail_configure_sp

後續步驟