sql >> Databasteknik >  >> RDS >> Sqlserver

Ta bort databaspostmeddelanden från msdb-databasen i SQL Server (T-SQL)

När du använder Database Mail för att skicka e-post från SQL Server, lagras e-postmeddelanden och deras bilagor i msdb databas. Du bör med jämna mellanrum ta bort dessa meddelanden för att förhindra att databasen blir stor.

För att radera dessa meddelanden med T-SQL, använd sysmail_delete_mailitems_sp lagrad procedur.

Du kan radera e-postmeddelanden baserat på deras sändningsförfrågansdatum (d.v.s. före ett visst datum) eller baserat på deras status. Du kan också ta bort alla e-postmeddelanden genom att använda det aktuella datumet som datum för begäran.

Visa alla meddelanden

Låt oss först se vilka meddelanden som finns i msdb databas.

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

Resultat:

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

Jag returnerade inte alla kolumner för den här vyn, eftersom det skulle ha varit för mycket data för att presentera här.

Ta bort gamla meddelanden

För att radera alla meddelanden som skickats före ett visst datum, använd @sent_before argument.

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

Resultat:

(4 rows affected)

Observera att sysmail_delete_mailitems_sp proceduren tar faktiskt bort e-postmeddelanden baserat på send_request_date istället för sent_date . Det är därför jag använder send_request_date när du tittar på e-postmeddelanden.

Visa alla meddelanden igen

Nu när jag frågar sysmail_allitems vy, de första fyra raderna har försvunnit.

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

Resultat:

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

Ta bort misslyckade meddelanden

För att radera alla meddelanden med en viss status, använd @sent_status argument.

Här är ett exempel på att radera alla misslyckade e-postmeddelanden.

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

Resultat:

(2 rows affected)

Visa alla meddelanden igen

Låt oss kontrollera sysmail_allitems se igen.

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

Resultat:

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

Ta bort alla meddelanden

För att radera alla meddelanden, använd @sent_date argument med datumvärdet GETDATE() .

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

Resultat:

(3 rows affected)

Visa alla meddelanden igen

Låt oss kontrollera sysmail_allitems se igen.

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

Resultat:

(0 rows affected)

Ta bort händelser från databasens e-postlogg

Observera att sysmail_delete_mailitems_sp tar inte bort motsvarande poster i Databas Mail-loggen. Använd sysmail_delete_log_sp för att radera händelser från Databas Mail-loggen.


  1. Hur man skapar ett formulär med formulärguiden

  2. Använda Oracle JDeveloper med MySQL Database Service på Oracle Cloud Platform, del 2

  3. Varför kan jag inte tvinga Oracle 11g att förbruka fler processorer för en enda SQL-fråga

  4. SQL Backup Recovery Tool för att reparera skadad SQL Backup - Produktrecension - Ett gästinlägg av Daniel Jones