適用於:SQL Server
Azure 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_addrolemember 和 sp_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。