sql >> Database teknologi >  >> RDS >> Sqlserver

Slet databasemail-meddelelser fra msdb-databasen i SQL Server (T-SQL)

Når du bruger Database Mail til at sende e-mails fra SQL Server, gemmes e-mail-meddelelser og deres vedhæftede filer i msdb database. Du bør med jævne mellemrum slette disse meddelelser for at forhindre databasen i at blive stor.

For at slette disse beskeder med T-SQL skal du bruge sysmail_delete_mailitems_sp gemt procedure.

Du kan slette e-mails baseret på deres sendeanmodningsdato (dvs. før en bestemt dato) eller baseret på deres status. Du kan også slette alle e-mails ved at bruge den aktuelle dato som anmodningsdato.

Se alle meddelelser

Lad os først se, hvilke meddelelser der er i msdb database.

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

Jeg returnerede ikke alle kolonner for denne visning, da der ville have været for mange data til at præsentere her.

Slet gamle meddelelser

For at slette alle beskeder, der blev sendt før en bestemt dato, skal du bruge @sent_before argument.

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

Resultat:

(4 rows affected)

Bemærk, at sysmail_delete_mailitems_sp procedure sletter faktisk e-mails baseret på send_request_date i stedet for sent_date . Det er derfor, jeg bruger send_request_date når du ser e-mail-beskederne.

Se alle meddelelser igen

Når jeg nu forespørger på sysmail_allitems visning, er de første fire rækker forsvundet.

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

Slet mislykkede meddelelser

For at slette alle beskeder med en bestemt status, brug @sent_status argument.

Her er et eksempel på sletning af alle mislykkede e-mails.

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

Resultat:

(2 rows affected)

Se alle meddelelser igen

Lad os tjekke 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 |
+---------------+---------------+-------------------------+

Slet alle meddelelser

For at slette alle beskeder skal du bruge @sent_date argument med en datoværdi på GETDATE() .

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

Resultat:

(3 rows affected)

Se alle meddelelser igen

Lad os tjekke sysmail_allitems se igen.

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

Resultat:

(0 rows affected)

Slet hændelser fra databasens maillog

Bemærk, at sysmail_delete_mailitems_sp sletter ikke de tilsvarende poster i Database Mail-loggen. Brug sysmail_delete_log_sp for at slette hændelser fra Database Mail-loggen.


  1. Henter UTF-8 tekst fra MySQL i R returnerer ????

  2. SQL Server-ydelse TOP CPU-forespørgsel -1

  3. Kør PostgreSQL-forespørgsler fra kommandolinjen

  4. SQL Server SMO klager over manglende DLL