Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Löschen von Datenbank-E-Mail-Nachrichten aus der msdb-Datenbank in SQL Server (T-SQL)

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:

+----------+---------------+------------- -----------+| mailitem_id | send_status | send_request_date ||---------------+---------------+--------------- ----------|| 1 | gescheitert | 2020-08-24 02:40:48.093 || 2 | gescheitert | 2020-08-24 02:47:40.833 || 3 | gesendet | 2020-08-24 03:58:57.887 || 4 | gesendet | 2020-08-24 04:11:19.300 || 5 | gescheitert | 2020-08-29 03:28:53.873 || 6 | gesendet | 2020-08-29 04:00:01.460 || 7 | gescheitert | 2020-08-29 04:44:54.720 || 8 | gesendet | 2020-08-29 04:45:08.080 || 1006 | gesendet | 2020-08-30 23:01:20.437 |+---------------+---------------+------ -------------------+

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:

+----------+---------------+------------- -----------+| mailitem_id | send_status | send_request_date ||---------------+---------------+--------------- ----------|| 5 | gescheitert | 2020-08-29 03:28:53.873 || 6 | gesendet | 2020-08-29 04:00:01.460 || 7 | gescheitert | 2020-08-29 04:44:54.720 || 8 | gesendet | 2020-08-29 04:45:08.080 || 1006 | gesendet | 2020-08-30 23:01:20.437 |+---------------+---------------+------ -------------------+

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:

+----------+---------------+------------- -----------+| mailitem_id | send_status | send_request_date ||---------------+---------------+--------------- ----------|| 6 | gesendet | 2020-08-29 04:00:01.460 || 8 | gesendet | 2020-08-29 04:45:08.080 || 1006 | gesendet | 2020-08-30 23:01:20.437 |+---------------+---------------+------ -------------------+

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.