Když používáte Database Mail k odesílání e-mailů ze serveru SQL, e-mailové zprávy a jejich přílohy se ukládají do msdb databáze. Tyto zprávy byste měli pravidelně odstraňovat, abyste zabránili růstu databáze.
Chcete-li tyto zprávy odstranit pomocí T-SQL, použijte sysmail_delete_mailitems_sp
uložená procedura.
E-mailové zprávy můžete smazat na základě data jejich požadavku na odeslání (tj. před určitým datem) nebo na základě jejich stavu. Můžete také odstranit všechny e-mailové zprávy tak, že jako datum požadavku použijete aktuální datum.
Zobrazit všechny zprávy
Nejprve se podívejme, jaké zprávy jsou v msdb databáze.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Výsledek:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Pro toto zobrazení jsem nevrátil všechny sloupce, protože by zde bylo příliš mnoho dat, která je zde nelze prezentovat.
Smazat staré zprávy
Chcete-li odstranit všechny zprávy, které byly odeslány před určitým datem, použijte @sent_before
argument.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = '2020-08-25';
Výsledek:
(4 rows affected)
Všimněte si, že sysmail_delete_mailitems_sp
procedura ve skutečnosti odstraní e-maily na základě send_request_date
spíše než sent_date
. Proto používám send_request_date
při prohlížení e-mailových zpráv.
Znovu zobrazit všechny zprávy
Nyní, když se dotazuji na sysmail_allitems
první čtyři řádky zmizely.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Výsledek:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Smazat neúspěšné zprávy
Chcete-li odstranit všechny zprávy určitého stavu, použijte @sent_status
argument.
Zde je příklad smazání všech neúspěšných e-mailových zpráv.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_status = 'failed';
Výsledek:
(2 rows affected)
Znovu zobrazit všechny zprávy
Pojďme zkontrolovat sysmail_allitems
zobrazit znovu.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Výsledek:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Smazat všechny zprávy
Chcete-li smazat všechny zprávy, použijte @sent_date
argument s hodnotou data GETDATE()
.
DECLARE @GETDATE datetime
SET @GETDATE = GETDATE();
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = @GETDATE;
Výsledek:
(3 rows affected)
Znovu zobrazit všechny zprávy
Podívejme se na sysmail_allitems
zobrazit znovu.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Výsledek:
(0 rows affected)
Odstranit události z protokolu pošty databáze
Všimněte si, že sysmail_delete_mailitems_sp
neodstraní odpovídající položky v protokolu pošty databáze. Použijte sysmail_delete_log_sp
k odstranění událostí z protokolu Database Mail.