Quando utilizzi Posta elettronica database per inviare e-mail da SQL Server, i messaggi e-mail e i relativi allegati vengono archiviati in msdb Banca dati. È necessario eliminare periodicamente questi messaggi per evitare che il database cresca a grandi dimensioni.
Per eliminare questi messaggi con T-SQL, usa il sysmail_delete_mailitems_sp
procedura memorizzata.
Puoi eliminare i messaggi di posta in base alla data della richiesta di invio (ovvero prima di una certa data) o in base al loro stato. Puoi anche eliminare tutti i messaggi di posta utilizzando la data corrente come data di richiesta.
Visualizza tutti i messaggi
Per prima cosa, vediamo quali messaggi ci sono in msdb banca dati.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Risultato:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Non ho restituito tutte le colonne per questa visualizzazione, poiché ci sarebbero stati troppi dati da presentare qui.
Elimina i vecchi messaggi
Per eliminare tutti i messaggi inviati prima di una certa data, utilizza il @sent_before
argomento.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = '2020-08-25';
Risultato:
(4 rows affected)
Nota che il sysmail_delete_mailitems_sp
la procedura elimina effettivamente le email in base alla send_request_date
anziché il sent_date
. Ecco perché sto usando send_request_date
durante la visualizzazione dei messaggi di posta elettronica.
Visualizza di nuovo tutti i messaggi
Ora, quando eseguo una query su sysmail_allitems
vista, le prime quattro righe sono scomparse.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Risultato:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Elimina i messaggi non riusciti
Per eliminare tutti i messaggi di un certo stato, usa il @sent_status
argomento.
Ecco un esempio di eliminazione di tutti i messaggi di posta non riusciti.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_status = 'failed';
Risultato:
(2 rows affected)
Visualizza di nuovo tutti i messaggi
Controlliamo il sysmail_allitems
visualizza di nuovo.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Risultato:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Elimina tutti i messaggi
Per eliminare tutti i messaggi, usa il @sent_date
argomento con un valore di data GETDATE()
.
DECLARE @GETDATE datetime
SET @GETDATE = GETDATE();
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = @GETDATE;
Risultato:
(3 rows affected)
Visualizza di nuovo tutti i messaggi
Controlliamo il sysmail_allitems
visualizza di nuovo.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Risultato:
(0 rows affected)
Elimina eventi dal registro di posta elettronica del database
Nota che sysmail_delete_mailitems_sp
non elimina le voci corrispondenti nel registro di Posta elettronica database. Usa sysmail_delete_log_sp
per eliminare gli eventi dal registro Posta database.