Quando você usa o Database Mail para enviar emails do SQL Server, as mensagens de email e seus anexos são armazenados no arquivo msdb base de dados. Você deve excluir periodicamente essas mensagens para evitar que o banco de dados fique muito grande.
Para excluir essas mensagens com T-SQL, use o
sysmail_delete_mailitems_sp
procedimento armazenado. Você pode excluir mensagens de e-mail com base na data de solicitação de envio (ou seja, antes de uma determinada data) ou com base em seu status. Você também pode excluir todas as mensagens de correio usando a data atual como a data da solicitação.
Ver todas as mensagens
Primeiro, vamos ver quais mensagens estão no msdb base de dados.
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 | +---------------+---------------+-------------------------+
Não retornei todas as colunas para esta visualização, pois haveria muitos dados para apresentar aqui.
Excluir mensagens antigas
Para excluir todas as mensagens enviadas antes de uma determinada data, use o
@sent_before
argumento. EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = '2020-08-25';
Resultado:
(4 rows affected)
Observe que o
sysmail_delete_mailitems_sp
na verdade, o procedimento exclui e-mails com base no send_request_date
em vez de sent_date
. É por isso que estou usando send_request_date
ao visualizar as mensagens de e-mail. Ver todas as mensagens novamente
Agora, quando eu consulto o
sysmail_allitems
vista, as primeiras quatro linhas desapareceram. 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 | +---------------+---------------+-------------------------+
Excluir mensagens com falha
Para excluir todas as mensagens de um determinado status, use o
@sent_status
argumento. Aqui está um exemplo de exclusão de todas as mensagens de e-mail com falha.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_status = 'failed';
Resultado:
(2 rows affected)
Ver todas as mensagens novamente
Vamos verificar os
sysmail_allitems
ver novamente. 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 | +---------------+---------------+-------------------------+
Excluir todas as mensagens
Para excluir todas as mensagens, use o
@sent_date
argumento com um valor de data de GETDATE()
. DECLARE @GETDATE datetime
SET @GETDATE = GETDATE();
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = @GETDATE;
Resultado:
(3 rows affected)
Ver todas as mensagens novamente
Vamos verificar os
sysmail_allitems
ver novamente. SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Resultado:
(0 rows affected)
Excluir eventos do log do Database Mail
Observe que
sysmail_delete_mailitems_sp
não exclui as entradas correspondentes no log do Database Mail. Use sysmail_delete_log_sp
para excluir eventos do log do Database Mail.