次の方法で共有


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

適用対象:SQL ServerAzure SQL Managed Instance

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

SQL Server インスタンスで T-SQL コマンドを実行するには、 SQL Server Management Studio (SSMS)Visual Studio Code 用の MSSQL 拡張機能sqlcmd、またはお気に入りの T-SQL クエリ ツールを使用します。

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

sp_send_dbmail ストアド プロシージャは、msdb データベースにインストールされます。 sp_send_dbmail データベースからmsdbを実行するか、ストアド プロシージャの 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 および関連ビューの項目の状態は更新されません。

次のステートメントを実行して、 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 で無効にします。 これらのストアド プロシージャを有効にするには、次の例のように、 システム ストアド プロシージャの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 データベースでデータベース メールが停止している可能性があります。 データベース メールの状態を確認するには、次のステートメントを実行します。

EXECUTE dbo.sysmail_help_status_sp;

メール ホスト データベースでデータベース メールを開始するには、 msdb データベースで次のコマンドを実行します。

EXECUTE dbo.sysmail_start_sp;

Service Broker がアクティブになっている場合、メッセージのダイアログの有効期間が確認されます。したがって、構成されたダイアログの有効期間よりも長く Service Broker 転送キューに登録されているすべてのメッセージがすぐに失敗します。 データベース メールにより、失敗したメッセージの状態が sysmail_allitems および関連するビューで更新されます。 電子メール メッセージを再び送信するかどうかを決定する必要があります。 データベース メールで使用されるダイアログの有効期間の構成の詳細については、「 sysmail_configure_sp」を参照してください。

次のステップ