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.