Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Supprimer les messages de messagerie de la base de données de la base de données msdb dans SQL Server (T-SQL)

Lorsque vous utilisez Database Mail pour envoyer des e-mails à partir de SQL Server, les e-mails et leurs pièces jointes sont stockés dans msdb base de données. Vous devez régulièrement supprimer ces messages pour éviter que la base de données ne devienne trop volumineuse.

Pour supprimer ces messages avec T-SQL, utilisez le sysmail_delete_mailitems_sp procédure stockée.

Vous pouvez supprimer des e-mails en fonction de leur date de demande d'envoi (c'est-à-dire avant une certaine date) ou en fonction de leur statut. Vous pouvez également supprimer tous les e-mails en utilisant la date actuelle comme date de demande.

Afficher tous les messages

Voyons d'abord quels messages se trouvent dans le msdb base de données.

SELECT 
    mailitem_id,
    sent_status,
    send_request_date
FROM msdb.dbo.sysmail_allitems;

Résultat :

+---------------+---------------+-------------------------+
| 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 |
+---------------+---------------+-------------------------+

Je n'ai pas renvoyé toutes les colonnes pour cette vue, car il y aurait eu trop de données à présenter ici.

Supprimer les anciens messages

Pour supprimer tous les messages envoyés avant une certaine date, utilisez le @sent_before arguments.

EXECUTE msdb.dbo.sysmail_delete_mailitems_sp   
    @sent_before = '2020-08-25';

Résultat :

(4 rows affected)

Notez que le sysmail_delete_mailitems_sp la procédure supprime en fait les e-mails en fonction de la send_request_date plutôt que le sent_date . C'est pourquoi j'utilise send_request_date lors de l'affichage des e-mails.

Afficher à nouveau tous les messages

Maintenant, lorsque j'interroge le sysmail_allitems vue, les quatre premières lignes ont disparu.

SELECT 
    mailitem_id,
    sent_status,
    send_request_date
FROM msdb.dbo.sysmail_allitems;

Résultat :

+---------------+---------------+-------------------------+
| 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 |
+---------------+---------------+-------------------------+

Supprimer les messages ayant échoué

Pour supprimer tous les messages d'un certain statut, utilisez le @sent_status arguments.

Voici un exemple de suppression de tous les e-mails ayant échoué.

EXECUTE msdb.dbo.sysmail_delete_mailitems_sp   
    @sent_status = 'failed';

Résultat :

(2 rows affected)

Afficher à nouveau tous les messages

Vérifions les sysmail_allitems revoir.

SELECT 
    mailitem_id,
    sent_status,
    send_request_date
FROM msdb.dbo.sysmail_allitems;

Résultat :

+---------------+---------------+-------------------------+
| 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 |
+---------------+---------------+-------------------------+

Supprimer tous les messages

Pour supprimer tous les messages, utilisez le @sent_date argument avec une valeur de date de GETDATE() .

DECLARE @GETDATE datetime  
SET @GETDATE = GETDATE();
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
    @sent_before = @GETDATE;

Résultat :

(3 rows affected)

Afficher à nouveau tous les messages

Vérifions les sysmail_allitems revoir.

SELECT 
    mailitem_id,
    sent_status,
    send_request_date
FROM msdb.dbo.sysmail_allitems;

Résultat :

(0 rows affected)

Supprimer des événements du journal de messagerie de la base de données

Notez que sysmail_delete_mailitems_sp ne supprime pas les entrées correspondantes dans le journal de messagerie de la base de données. Utilisez sysmail_delete_log_sp pour supprimer des événements du journal de messagerie de la base de données.