sql >> Database >  >> RDS >> Sqlserver

Database-e-mailberichten verwijderen uit de msdb-database in SQL Server (T-SQL)

Wanneer u Database Mail gebruikt om e-mails te verzenden vanuit SQL Server, worden e-mailberichten en hun bijlagen opgeslagen in de msdb databank. U moet deze berichten regelmatig verwijderen om te voorkomen dat de database te groot wordt.

Om deze berichten met T-SQL te verwijderen, gebruikt u de sysmail_delete_mailitems_sp opgeslagen procedure.

U kunt e-mailberichten verwijderen op basis van hun verzendverzoekdatum (d.w.z. vóór een bepaalde datum) of op basis van hun status. U kunt ook alle e-mailberichten verwijderen door de huidige datum als aanvraagdatum te gebruiken.

Bekijk alle berichten

Laten we eerst eens kijken welke berichten er in de msdb . staan database.

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

Resultaat:

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

Ik heb niet alle kolommen voor deze weergave geretourneerd, omdat er te veel gegevens zouden zijn om hier weer te geven.

Oude berichten verwijderen

Om alle berichten te verwijderen die vóór een bepaalde datum zijn verzonden, gebruikt u de @sent_before argument.

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

Resultaat:

(4 rows affected)

Merk op dat de sysmail_delete_mailitems_sp procedure verwijdert daadwerkelijk e-mails op basis van de send_request_date in plaats van de sent_date . Daarom gebruik ik send_request_date bij het bekijken van de e-mailberichten.

Bekijk alle berichten opnieuw

Als ik nu de sysmail_allitems . vraag bekijken, zijn de eerste vier rijen verdwenen.

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

Resultaat:

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

Verwijder mislukte berichten

Om alle berichten met een bepaalde status te verwijderen, gebruik je de @sent_status argument.

Hier is een voorbeeld van het verwijderen van alle mislukte e-mailberichten.

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

Resultaat:

(2 rows affected)

Bekijk alle berichten opnieuw

Laten we de sysmail_allitems . controleren opnieuw bekijken.

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

Resultaat:

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

Verwijder alle berichten

Gebruik de @sent_date . om alle berichten te verwijderen argument met een datumwaarde van GETDATE() .

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

Resultaat:

(3 rows affected)

Bekijk alle berichten opnieuw

Laten we de sysmail_allitems . controleren opnieuw bekijken.

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

Resultaat:

(0 rows affected)

Gebeurtenissen verwijderen uit het e-maillogboek van de database

Merk op dat sysmail_delete_mailitems_sp verwijdert de corresponderende vermeldingen in het logboek van Database Mail niet. Gebruik sysmail_delete_log_sp om gebeurtenissen uit het Database Mail-logboek te verwijderen.


  1. Verwijder dubbele rijen in MySQL

  2. Postgresql UUID ondersteund door Hibernate?

  3. Boom sorteren met een gematerialiseerd pad?

  4. Dynamische SQL - EXEC(@SQL) versus EXEC SP_EXECUTESQL(@SQL)