データベース メールの一般的なエラー

適用対象: SQL Server Azure SQL Managed Instance

この記事では、データベース メールでよく見られるエラーとその解決策について説明します。

ストアド プロシージャ 'sp_send_dbmail' が見つかりませんでした

sp_send_dbmail ストアド プロシージャは msdb データベースにインストールされています。 msdb データベースから sp_send_dbmail を実行するか、3 部構成の名前をこのストアド プロシージャに指定する必要があります。

例:

EXEC msdb.dbo.sp_send_dbmail ...

または:

USE msdb;
GO
EXEC dbo.sp_send_dbmail ...

データベース メールの作成および構成には、データベース メール構成ウィザードを使用します。

プロファイルが無効です

このメッセージには 2 つの原因が考えられます。 指定されたプロファイルが存在しないか、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 に依存します。 データベース メールが停止している場合、または Service Broker のメッセージ配信が msdb データベースでアクティブになっていない場合は、データベース メールによってメッセージがデータベースのキューに登録されますが、そのメッセージは配信できません。 この場合、Service Broker メッセージは Service Broker のメール キューに残ります。 Service Broker では外部プログラムがアクティブ化されないので、sysmail_event_log にはログ エントリが存在せず、sysmail_allitems および関連するビューのアイテムの状態は更新されません。

次のステートメントを実行し、Service Broker が msdb データベースで有効になっているかどうかを確認します。

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 で無効にします。 これらのストアド プロシージャを有効にするには、次の例のように、sp_configure システム ストアド プロシージャの Database Mail XPs オプションを使用します。

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)」を参照してください。

関連項目