Gdy używasz poczty bazy danych do wysyłania wiadomości e-mail z programu SQL Server, wiadomości e-mail i ich załączniki są przechowywane w msdb Baza danych. Należy okresowo usuwać te wiadomości, aby zapobiec powiększaniu się bazy danych.
Aby usunąć te wiadomości za pomocą T-SQL, użyj sysmail_delete_mailitems_sp
procedura składowana.
Możesz usuwać wiadomości e-mail na podstawie daty żądania wysłania (tj. przed określoną datą) lub na podstawie ich statusu. Możesz także usunąć wszystkie wiadomości e-mail, używając bieżącej daty jako daty żądania.
Wyświetl wszystkie wiadomości
Najpierw zobaczmy, jakie wiadomości znajdują się w msdb baza danych.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Wynik:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Nie zwróciłem wszystkich kolumn dla tego widoku, ponieważ byłoby tu za dużo danych do zaprezentowania.
Usuń stare wiadomości
Aby usunąć wszystkie wiadomości wysłane przed określoną datą, użyj @sent_before
argument.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = '2020-08-25';
Wynik:
(4 rows affected)
Zauważ, że sysmail_delete_mailitems_sp
procedura faktycznie usuwa wiadomości e-mail na podstawie send_request_date
zamiast sent_date
. Dlatego używam send_request_date
podczas przeglądania wiadomości e-mail.
Ponownie wyświetl wszystkie wiadomości
Teraz, gdy wysyłam zapytanie do sysmail_allitems
widok, pierwsze cztery rzędy zniknęły.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Wynik:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Usuń nieudane wiadomości
Aby usunąć wszystkie wiadomości o określonym statusie, użyj @sent_status
argument.
Oto przykład usuwania wszystkich nieudanych wiadomości e-mail.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_status = 'failed';
Wynik:
(2 rows affected)
Ponownie wyświetl wszystkie wiadomości
Sprawdźmy sysmail_allitems
zobacz ponownie.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Wynik:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Usuń wszystkie wiadomości
Aby usunąć wszystkie wiadomości, użyj @sent_date
argument z wartością daty GETDATE()
.
DECLARE @GETDATE datetime
SET @GETDATE = GETDATE();
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = @GETDATE;
Wynik:
(3 rows affected)
Ponownie wyświetl wszystkie wiadomości
Sprawdźmy sysmail_allitems
zobacz ponownie.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Wynik:
(0 rows affected)
Usuń zdarzenia z dziennika poczty bazy danych
Zwróć uwagę, że sysmail_delete_mailitems_sp
nie usuwa odpowiednich wpisów w dzienniku poczty bazy danych. Użyj sysmail_delete_log_sp
aby usunąć zdarzenia z dziennika poczty bazy danych.