Wenn Sie Datenbank-E-Mail zum Senden von E-Mails von SQL Server verwenden, werden E-Mail-Nachrichten und ihre Anhänge in der msdb gespeichert Datenbank. Sie sollten diese Nachrichten regelmäßig löschen, um zu verhindern, dass die Datenbank zu groß wird.
Um diese Nachrichten mit T-SQL zu löschen, verwenden Sie sysmail_delete_mailitems_sp
gespeicherte Prozedur.
Sie können E-Mail-Nachrichten basierend auf ihrem Sendeanforderungsdatum (d. h. vor einem bestimmten Datum) oder basierend auf ihrem Status löschen. Sie können auch alle E-Mail-Nachrichten löschen, indem Sie das aktuelle Datum als Anforderungsdatum verwenden.
Alle Nachrichten anzeigen
Sehen wir uns zunächst an, welche Nachrichten in der msdb enthalten sind Datenbank.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Ergebnis:
Ich habe nicht alle Spalten für diese Ansicht zurückgegeben, da es zu viele Daten gegeben hätte, um sie hier darzustellen.
Alte Nachrichten löschen
Um alle Nachrichten zu löschen, die vor einem bestimmten Datum gesendet wurden, verwenden Sie den @sent_before
Argument.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = '2020-08-25';
Ergebnis:
(4 Zeilen betroffen)
Beachten Sie, dass die Datei sysmail_delete_mailitems_sp
Die Prozedur löscht tatsächlich E-Mails basierend auf dem send_request_date
anstelle des sent_date
. Deshalb verwende ich send_request_date
beim Anzeigen der E-Mail-Nachrichten.
Alle Nachrichten erneut anzeigen
Wenn ich jetzt die sysmail_allitems
abfrage sind die ersten vier Zeilen verschwunden.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Ergebnis:
Fehlgeschlagene Nachrichten löschen
Um alle Nachrichten eines bestimmten Status zu löschen, verwenden Sie den @sent_status
Argument.
Hier ist ein Beispiel für das Löschen aller fehlgeschlagenen E-Mail-Nachrichten.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_status = 'failed';
Ergebnis:
(2 Zeilen betroffen)
Alle Nachrichten erneut anzeigen
Lassen Sie uns die sysmail_allitems
überprüfen erneut ansehen.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Ergebnis:
Alle Nachrichten löschen
Um alle Nachrichten zu löschen, verwenden Sie @sent_date
Argument mit einem Datumswert von GETDATE()
.
DECLARE @GETDATE datetime
SET @GETDATE = GETDATE();
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = @GETDATE;
Ergebnis:
(3 Zeilen betroffen)
Alle Nachrichten erneut anzeigen
Lassen Sie uns die sysmail_allitems
überprüfen erneut ansehen.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Ergebnis:
(0 Zeilen betroffen)
Ereignisse aus dem Datenbank-E-Mail-Protokoll löschen
Beachten Sie, dass sysmail_delete_mailitems_sp
löscht die entsprechenden Einträge im Datenbank-E-Mail-Protokoll nicht. Verwenden Sie sysmail_delete_log_sp
um Ereignisse aus dem Datenbank-E-Mail-Protokoll zu löschen.