データベースメールを使用してSQLServerから電子メールを送信する場合、電子メールメッセージとその添付ファイルは msdbに保存されます。 データベース。データベースが大きくなるのを防ぐために、これらのメッセージを定期的に削除する必要があります。
T-SQLでこれらのメッセージを削除するには、sysmail_delete_mailitems_sp
を使用します ストアドプロシージャ。
メールメッセージは、送信リクエストの日付(特定の日付より前)またはステータスに基づいて削除できます。現在の日付をリクエスト日として使用して、すべてのメールメッセージを削除することもできます。
すべてのメッセージを表示
まず、 msdbにあるメッセージを見てみましょう。 データベース。
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
結果:
+---------------+---------------+-------------------------+ | mailitem_id | sent_status | send_request_date | |---------------+---------------+-------------------------| | 1 | failed | 2020-08-24 02:40:48.093 | | 2 | failed | 2020-08-24 02:47:40.833 | | 3 | sent | 2020-08-24 03:58:57.887 | | 4 | sent | 2020-08-24 04:11:19.300 | | 5 | failed | 2020-08-29 03:28:53.873 | | 6 | sent | 2020-08-29 04:00:01.460 | | 7 | failed | 2020-08-29 04:44:54.720 | | 8 | sent | 2020-08-29 04:45:08.080 | | 1006 | sent | 2020-08-30 23:01:20.437 | +---------------+---------------+-------------------------+
ここに表示するにはデータが多すぎるため、このビューのすべての列を返しませんでした。
古いメッセージを削除する
特定の日付より前に送信されたすべてのメッセージを削除するには、@sent_before
を使用します 引数。
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = '2020-08-25';
結果:
(4 rows affected)
sysmail_delete_mailitems_sp
に注意してください プロシージャは、send_request_date
に基づいて実際にメールを削除します sent_date
ではなく 。そのため、send_request_date
を使用しています メールメッセージを表示するとき。
すべてのメッセージをもう一度表示
ここで、sysmail_allitems
をクエリすると ビューでは、最初の4行が消えています。
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
結果:
+---------------+---------------+-------------------------+ | mailitem_id | sent_status | send_request_date | |---------------+---------------+-------------------------| | 5 | failed | 2020-08-29 03:28:53.873 | | 6 | sent | 2020-08-29 04:00:01.460 | | 7 | failed | 2020-08-29 04:44:54.720 | | 8 | sent | 2020-08-29 04:45:08.080 | | 1006 | sent | 2020-08-30 23:01:20.437 | +---------------+---------------+-------------------------+
失敗したメッセージの削除
特定のステータスのすべてのメッセージを削除するには、@sent_status
を使用します 引数。
失敗したすべてのメールメッセージを削除する例を次に示します。
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_status = 'failed';
結果:
(2 rows affected)
すべてのメッセージをもう一度表示
sysmail_allitems
を確認しましょう もう一度表示します。
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
結果:
+---------------+---------------+-------------------------+ | mailitem_id | sent_status | send_request_date | |---------------+---------------+-------------------------| | 6 | sent | 2020-08-29 04:00:01.460 | | 8 | sent | 2020-08-29 04:45:08.080 | | 1006 | sent | 2020-08-30 23:01:20.437 | +---------------+---------------+-------------------------+
すべてのメッセージを削除
すべてのメッセージを削除するには、@sent_date
を使用します 日付値がGETDATE()
の引数 。
DECLARE @GETDATE datetime
SET @GETDATE = GETDATE();
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = @GETDATE;
結果:
(3 rows affected)
すべてのメッセージをもう一度表示
sysmail_allitems
を確認しましょう もう一度表示します。
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
結果:
(0 rows affected)
データベースメールログからイベントを削除する
sysmail_delete_mailitems_sp
に注意してください データベースメールログの対応するエントリは削除されません。 sysmail_delete_log_sp
を使用します データベースメールログからイベントを削除します。