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.