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.