sql >> Base de Datos >  >> RDS >> Sqlserver

Eliminar mensajes de correo de la base de datos de la base de datos msdb en SQL Server (T-SQL)

Cuando usa el Correo electrónico de base de datos para enviar correos electrónicos desde SQL Server, los mensajes de correo electrónico y sus archivos adjuntos se almacenan en msdb. base de datos. Debe eliminar periódicamente estos mensajes para evitar que la base de datos crezca demasiado.

Para eliminar estos mensajes con T-SQL, use el sysmail_delete_mailitems_sp procedimiento almacenado.

Puede eliminar mensajes de correo en función de su fecha de solicitud de envío (es decir, antes de una fecha determinada) o en función de su estado. También puede eliminar todos los mensajes de correo utilizando la fecha actual como fecha de solicitud.

Ver todos los mensajes

Primero, veamos qué mensajes hay en el msdb base de datos.

SELECT 
    mailitem_id,
    sent_status,
    send_request_date
FROM msdb.dbo.sysmail_allitems;

Resultado:

+---------------+---------------+-------------------------+
| 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 |
+---------------+---------------+-------------------------+

No devolví todas las columnas para esta vista, ya que habría demasiados datos para presentar aquí.

Eliminar mensajes antiguos

Para eliminar todos los mensajes que se enviaron antes de una fecha determinada, utilice el @sent_before argumento.

EXECUTE msdb.dbo.sysmail_delete_mailitems_sp   
    @sent_before = '2020-08-25';

Resultado:

(4 rows affected)

Tenga en cuenta que sysmail_delete_mailitems_sp el procedimiento en realidad elimina los correos electrónicos en función de la send_request_date en lugar de sent_date . Por eso estoy usando send_request_date al ver los mensajes de correo electrónico.

Ver todos los mensajes de nuevo

Ahora, cuando consulto sysmail_allitems vista, las primeras cuatro filas han desaparecido.

SELECT 
    mailitem_id,
    sent_status,
    send_request_date
FROM msdb.dbo.sysmail_allitems;

Resultado:

+---------------+---------------+-------------------------+
| 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 |
+---------------+---------------+-------------------------+

Eliminar mensajes fallidos

Para eliminar todos los mensajes de un determinado estado, utilice el @sent_status argumento.

Este es un ejemplo de cómo eliminar todos los mensajes de correo fallidos.

EXECUTE msdb.dbo.sysmail_delete_mailitems_sp   
    @sent_status = 'failed';

Resultado:

(2 rows affected)

Ver todos los mensajes de nuevo

Revisemos el sysmail_allitems ver de nuevo.

SELECT 
    mailitem_id,
    sent_status,
    send_request_date
FROM msdb.dbo.sysmail_allitems;

Resultado:

+---------------+---------------+-------------------------+
| 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 |
+---------------+---------------+-------------------------+

Eliminar todos los mensajes

Para eliminar todos los mensajes, use @sent_date argumento con un valor de fecha de GETDATE() .

DECLARE @GETDATE datetime  
SET @GETDATE = GETDATE();
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
    @sent_before = @GETDATE;

Resultado:

(3 rows affected)

Ver todos los mensajes de nuevo

Revisemos el sysmail_allitems ver de nuevo.

SELECT 
    mailitem_id,
    sent_status,
    send_request_date
FROM msdb.dbo.sysmail_allitems;

Resultado:

(0 rows affected)

Eliminar eventos del registro de correo de la base de datos

Tenga en cuenta que sysmail_delete_mailitems_sp no elimina las entradas correspondientes en el registro del correo electrónico de la base de datos. Utilice sysmail_delete_log_sp para eliminar eventos del registro del Correo electrónico de la base de datos.