Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Usuń wiadomości e-mail bazy danych z bazy danych msdb w programie SQL Server (T-SQL)

Gdy używasz poczty bazy danych do wysyłania wiadomości e-mail z programu SQL Server, wiadomości e-mail i ich załączniki są przechowywane w msdb Baza danych. Należy okresowo usuwać te wiadomości, aby zapobiec powiększaniu się bazy danych.

Aby usunąć te wiadomości za pomocą T-SQL, użyj sysmail_delete_mailitems_sp procedura składowana.

Możesz usuwać wiadomości e-mail na podstawie daty żądania wysłania (tj. przed określoną datą) lub na podstawie ich statusu. Możesz także usunąć wszystkie wiadomości e-mail, używając bieżącej daty jako daty żądania.

Wyświetl wszystkie wiadomości

Najpierw zobaczmy, jakie wiadomości znajdują się w msdb baza danych.

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

Wynik:

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

Nie zwróciłem wszystkich kolumn dla tego widoku, ponieważ byłoby tu za dużo danych do zaprezentowania.

Usuń stare wiadomości

Aby usunąć wszystkie wiadomości wysłane przed określoną datą, użyj @sent_before argument.

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

Wynik:

(4 rows affected)

Zauważ, że sysmail_delete_mailitems_sp procedura faktycznie usuwa wiadomości e-mail na podstawie send_request_date zamiast sent_date . Dlatego używam send_request_date podczas przeglądania wiadomości e-mail.

Ponownie wyświetl wszystkie wiadomości

Teraz, gdy wysyłam zapytanie do sysmail_allitems widok, pierwsze cztery rzędy zniknęły.

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

Wynik:

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

Usuń nieudane wiadomości

Aby usunąć wszystkie wiadomości o określonym statusie, użyj @sent_status argument.

Oto przykład usuwania wszystkich nieudanych wiadomości e-mail.

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

Wynik:

(2 rows affected)

Ponownie wyświetl wszystkie wiadomości

Sprawdźmy sysmail_allitems zobacz ponownie.

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

Wynik:

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

Usuń wszystkie wiadomości

Aby usunąć wszystkie wiadomości, użyj @sent_date argument z wartością daty GETDATE() .

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

Wynik:

(3 rows affected)

Ponownie wyświetl wszystkie wiadomości

Sprawdźmy sysmail_allitems zobacz ponownie.

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

Wynik:

(0 rows affected)

Usuń zdarzenia z dziennika poczty bazy danych

Zwróć uwagę, że sysmail_delete_mailitems_sp nie usuwa odpowiednich wpisów w dzienniku poczty bazy danych. Użyj sysmail_delete_log_sp aby usunąć zdarzenia z dziennika poczty bazy danych.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak utworzyć tabelę w SQL Server za pomocą zapytania

  2. Jak zwrócić wiele wartości w jednej kolumnie (T-SQL)?

  3. Pojawia się dziwny błąd, zapytanie SQL Server przy użyciu klauzuli `WITH`

  4. Co robi to zapytanie, aby utworzyć listę rozdzielaną przecinkami w programie SQL Server?

  5. Sprawdź nieudane wiadomości e-mail w programie SQL Server (T-SQL)