När du använder Database Mail för att skicka e-post från SQL Server, lagras e-postmeddelanden och deras bilagor i msdb databas. Du bör med jämna mellanrum ta bort dessa meddelanden för att förhindra att databasen blir stor.
För att radera dessa meddelanden med T-SQL, använd sysmail_delete_mailitems_sp
lagrad procedur.
Du kan radera e-postmeddelanden baserat på deras sändningsförfrågansdatum (d.v.s. före ett visst datum) eller baserat på deras status. Du kan också ta bort alla e-postmeddelanden genom att använda det aktuella datumet som datum för begäran.
Visa alla meddelanden
Låt oss först se vilka meddelanden som finns i msdb databas.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Resultat:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Jag returnerade inte alla kolumner för den här vyn, eftersom det skulle ha varit för mycket data för att presentera här.
Ta bort gamla meddelanden
För att radera alla meddelanden som skickats före ett visst datum, använd @sent_before
argument.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = '2020-08-25';
Resultat:
(4 rows affected)
Observera att sysmail_delete_mailitems_sp
proceduren tar faktiskt bort e-postmeddelanden baserat på send_request_date
istället för sent_date
. Det är därför jag använder send_request_date
när du tittar på e-postmeddelanden.
Visa alla meddelanden igen
Nu när jag frågar sysmail_allitems
vy, de första fyra raderna har försvunnit.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Resultat:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Ta bort misslyckade meddelanden
För att radera alla meddelanden med en viss status, använd @sent_status
argument.
Här är ett exempel på att radera alla misslyckade e-postmeddelanden.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_status = 'failed';
Resultat:
(2 rows affected)
Visa alla meddelanden igen
Låt oss kontrollera sysmail_allitems
se igen.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Resultat:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Ta bort alla meddelanden
För att radera alla meddelanden, använd @sent_date
argument med datumvärdet GETDATE()
.
DECLARE @GETDATE datetime
SET @GETDATE = GETDATE();
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = @GETDATE;
Resultat:
(3 rows affected)
Visa alla meddelanden igen
Låt oss kontrollera sysmail_allitems
se igen.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Resultat:
(0 rows affected)
Ta bort händelser från databasens e-postlogg
Observera att sysmail_delete_mailitems_sp
tar inte bort motsvarande poster i Databas Mail-loggen. Använd sysmail_delete_log_sp
för att radera händelser från Databas Mail-loggen.