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.