Когато използвате 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.