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