Wanneer u Database Mail gebruikt om e-mails te verzenden vanuit SQL Server, worden e-mailberichten en hun bijlagen opgeslagen in de msdb databank. U moet deze berichten regelmatig verwijderen om te voorkomen dat de database te groot wordt.
Om deze berichten met T-SQL te verwijderen, gebruikt u de sysmail_delete_mailitems_sp
opgeslagen procedure.
U kunt e-mailberichten verwijderen op basis van hun verzendverzoekdatum (d.w.z. vóór een bepaalde datum) of op basis van hun status. U kunt ook alle e-mailberichten verwijderen door de huidige datum als aanvraagdatum te gebruiken.
Bekijk alle berichten
Laten we eerst eens kijken welke berichten er in de msdb . staan database.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Resultaat:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Ik heb niet alle kolommen voor deze weergave geretourneerd, omdat er te veel gegevens zouden zijn om hier weer te geven.
Oude berichten verwijderen
Om alle berichten te verwijderen die vóór een bepaalde datum zijn verzonden, gebruikt u de @sent_before
argument.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = '2020-08-25';
Resultaat:
(4 rows affected)
Merk op dat de sysmail_delete_mailitems_sp
procedure verwijdert daadwerkelijk e-mails op basis van de send_request_date
in plaats van de sent_date
. Daarom gebruik ik send_request_date
bij het bekijken van de e-mailberichten.
Bekijk alle berichten opnieuw
Als ik nu de sysmail_allitems
. vraag bekijken, zijn de eerste vier rijen verdwenen.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Resultaat:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Verwijder mislukte berichten
Om alle berichten met een bepaalde status te verwijderen, gebruik je de @sent_status
argument.
Hier is een voorbeeld van het verwijderen van alle mislukte e-mailberichten.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_status = 'failed';
Resultaat:
(2 rows affected)
Bekijk alle berichten opnieuw
Laten we de sysmail_allitems
. controleren opnieuw bekijken.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Resultaat:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Verwijder alle berichten
Gebruik de @sent_date
. om alle berichten te verwijderen argument met een datumwaarde van GETDATE()
.
DECLARE @GETDATE datetime
SET @GETDATE = GETDATE();
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = @GETDATE;
Resultaat:
(3 rows affected)
Bekijk alle berichten opnieuw
Laten we de sysmail_allitems
. controleren opnieuw bekijken.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Resultaat:
(0 rows affected)
Gebeurtenissen verwijderen uit het e-maillogboek van de database
Merk op dat sysmail_delete_mailitems_sp
verwijdert de corresponderende vermeldingen in het logboek van Database Mail niet. Gebruik sysmail_delete_log_sp
om gebeurtenissen uit het Database Mail-logboek te verwijderen.