Når du bruger Database Mail til at sende e-mails fra SQL Server, gemmes e-mail-meddelelser og deres vedhæftede filer i msdb database. Du bør med jævne mellemrum slette disse meddelelser for at forhindre databasen i at blive stor.
For at slette disse beskeder med T-SQL skal du bruge sysmail_delete_mailitems_sp
gemt procedure.
Du kan slette e-mails baseret på deres sendeanmodningsdato (dvs. før en bestemt dato) eller baseret på deres status. Du kan også slette alle e-mails ved at bruge den aktuelle dato som anmodningsdato.
Se alle meddelelser
Lad os først se, hvilke meddelelser der er i msdb database.
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 | +---------------+---------------+-------------------------+
Jeg returnerede ikke alle kolonner for denne visning, da der ville have været for mange data til at præsentere her.
Slet gamle meddelelser
For at slette alle beskeder, der blev sendt før en bestemt dato, skal du bruge @sent_before
argument.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = '2020-08-25';
Resultat:
(4 rows affected)
Bemærk, at sysmail_delete_mailitems_sp
procedure sletter faktisk e-mails baseret på send_request_date
i stedet for sent_date
. Det er derfor, jeg bruger send_request_date
når du ser e-mail-beskederne.
Se alle meddelelser igen
Når jeg nu forespørger på sysmail_allitems
visning, er de første fire rækker forsvundet.
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 | +---------------+---------------+-------------------------+
Slet mislykkede meddelelser
For at slette alle beskeder med en bestemt status, brug @sent_status
argument.
Her er et eksempel på sletning af alle mislykkede e-mails.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_status = 'failed';
Resultat:
(2 rows affected)
Se alle meddelelser igen
Lad os tjekke 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 | +---------------+---------------+-------------------------+
Slet alle meddelelser
For at slette alle beskeder skal du bruge @sent_date
argument med en datoværdi på GETDATE()
.
DECLARE @GETDATE datetime
SET @GETDATE = GETDATE();
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = @GETDATE;
Resultat:
(3 rows affected)
Se alle meddelelser igen
Lad os tjekke sysmail_allitems
se igen.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Resultat:
(0 rows affected)
Slet hændelser fra databasens maillog
Bemærk, at sysmail_delete_mailitems_sp
sletter ikke de tilsvarende poster i Database Mail-loggen. Brug sysmail_delete_log_sp
for at slette hændelser fra Database Mail-loggen.