Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Excluir mensagens do Database Mail do banco de dados msdb no SQL Server (T-SQL)


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.