Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Изтрийте пощенските съобщения от базата данни от базата данни msdb в SQL Server (T-SQL)

Когато използвате Database Mail за изпращане на имейли от SQL Server, имейл съобщенията и техните прикачени файлове се съхраняват в msdb база данни. Трябва периодично да изтривате тези съобщения, за да предотвратите увеличаването на базата данни.

За да изтриете тези съобщения с T-SQL, използвайте sysmail_delete_mailitems_sp съхранена процедура.

Можете да изтривате имейл съобщения въз основа на датата на изпращане на заявка (т.е. преди определена дата) или въз основа на техния статус. Можете също да изтриете всички имейл съобщения, като използвате текущата дата като дата на заявка.

Преглед на всички съобщения

Първо, нека видим какви съобщения има в msdb база данни.

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

Резултат:

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

Не върнах всички колони за този изглед, тъй като щеше да има твърде много данни за представяне тук.

Изтриване на стари съобщения

За да изтриете всички съобщения, изпратени преди определена дата, използвайте @sent_before аргумент.

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

Резултат:

(4 rows affected)

Имайте предвид, че sysmail_delete_mailitems_sp процедурата всъщност изтрива имейли въз основа на send_request_date вместо sent_date . Ето защо използвам send_request_date когато преглеждате имейл съобщенията.

Преглед на всички съобщения отново

Сега, когато питам sysmail_allitems изглед, първите четири реда са изчезнали.

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

Резултат:

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

Изтриване на неуспешни съобщения

За да изтриете всички съобщения с определено състояние, използвайте @sent_status аргумент.

Ето пример за изтриване на всички неуспешни имейл съобщения.

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

Резултат:

(2 rows affected)

Преглед на всички съобщения отново

Нека проверим sysmail_allitems прегледайте отново.

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

Резултат:

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

Изтриване на всички съобщения

За да изтриете всички съобщения, използвайте @sent_date аргумент със стойност на дата GETDATE() .

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

Резултат:

(3 rows affected)

Преглед на всички съобщения отново

Нека проверим sysmail_allitems прегледайте отново.

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

Резултат:

(0 rows affected)

Изтриване на събития от пощенския дневник на базата данни

Имайте предвид, че sysmail_delete_mailitems_sp не изтрива съответните записи в дневника на Database Mail. Използвайте sysmail_delete_log_sp за да изтриете събития от дневника на Database Mail.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SELECT DISTINCT игнорира различни случаи

  2. SQL Server 2005 ROW_NUMBER() без ORDER BY

  3. Как да използвате ВСЕКИ / НЯКОЙ логически оператор в SQL Server - SQL Server / TSQL урок, част 127

  4. Как да премахнете HTML тагове от низ в SQL Server?

  5. Как да зададете цвета на лентата на състоянието в SSMS за различни екземпляри на SQL сървър - SQL Server / TSQL урок, част 6