sql >> データベース >  >> RDS >> Sqlserver

SQL Server(T-SQL)のmsdbデータベースからデータベースメールメッセージを削除する

    データベースメールを使用して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を使用します データベースメールログからイベントを削除します。


    1. TOPまたはLIMITを使用せずにTOP10行を取得しますか? –今週のインタビュー質問#247

    2. MySQLエラー2014の原因他のバッファリングされていないクエリがアクティブな間はクエリを実行できません

    3. ServiceNowとOracleIdentityCloud Service(IDCS)の統合

    4. EMCLIによるブラックアウト