Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Elimina i messaggi di posta del database dal database msdb in SQL Server (T-SQL)

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.