sql >> Databáze >  >> RDS >> Sqlserver

Odstranit databázové poštovní zprávy z databáze msdb v SQL Server (T-SQL)

Když používáte Database Mail k odesílání e-mailů ze serveru SQL, e-mailové zprávy a jejich přílohy se ukládají do msdb databáze. Tyto zprávy byste měli pravidelně odstraňovat, abyste zabránili růstu databáze.

Chcete-li tyto zprávy odstranit pomocí T-SQL, použijte sysmail_delete_mailitems_sp uložená procedura.

E-mailové zprávy můžete smazat na základě data jejich požadavku na odeslání (tj. před určitým datem) nebo na základě jejich stavu. Můžete také odstranit všechny e-mailové zprávy tak, že jako datum požadavku použijete aktuální datum.

Zobrazit všechny zprávy

Nejprve se podívejme, jaké zprávy jsou v msdb databáze.

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

Výsledek:

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

Pro toto zobrazení jsem nevrátil všechny sloupce, protože by zde bylo příliš mnoho dat, která je zde nelze prezentovat.

Smazat staré zprávy

Chcete-li odstranit všechny zprávy, které byly odeslány před určitým datem, použijte @sent_before argument.

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

Výsledek:

(4 rows affected)

Všimněte si, že sysmail_delete_mailitems_sp procedura ve skutečnosti odstraní e-maily na základě send_request_date spíše než sent_date . Proto používám send_request_date při prohlížení e-mailových zpráv.

Znovu zobrazit všechny zprávy

Nyní, když se dotazuji na sysmail_allitems první čtyři řádky zmizely.

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

Výsledek:

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

Smazat neúspěšné zprávy

Chcete-li odstranit všechny zprávy určitého stavu, použijte @sent_status argument.

Zde je příklad smazání všech neúspěšných e-mailových zpráv.

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

Výsledek:

(2 rows affected)

Znovu zobrazit všechny zprávy

Pojďme zkontrolovat sysmail_allitems zobrazit znovu.

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

Výsledek:

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

Smazat všechny zprávy

Chcete-li smazat všechny zprávy, použijte @sent_date argument s hodnotou data GETDATE() .

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

Výsledek:

(3 rows affected)

Znovu zobrazit všechny zprávy

Podívejme se na sysmail_allitems zobrazit znovu.

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

Výsledek:

(0 rows affected)

Odstranit události z protokolu pošty databáze

Všimněte si, že sysmail_delete_mailitems_sp neodstraní odpovídající položky v protokolu pošty databáze. Použijte sysmail_delete_log_sp k odstranění událostí z protokolu Database Mail.


  1. Nelze dešifrovat pomocí pgcrypto z AES-256-CBC, ale AES-128-CBC je v pořádku

  2. Jak se připojit k databázi SQL serveru z aplikace Windows 10 UWP

  3. Android:otevírání a zavírání databáze SQLite

  4. Jak vytvořit formulář z tabulky v Accessu 2016