Saat Anda menggunakan Database Mail untuk mengirim email dari SQL Server, pesan email dan lampirannya disimpan di msdb basis data. Anda harus menghapus pesan ini secara berkala untuk mencegah database tumbuh menjadi besar.
Untuk menghapus pesan ini dengan T-SQL, gunakan sysmail_delete_mailitems_sp
prosedur tersimpan.
Anda dapat menghapus pesan email berdasarkan tanggal permintaan pengirimannya (yaitu sebelum tanggal tertentu) atau berdasarkan statusnya. Anda juga dapat menghapus semua pesan email dengan menggunakan tanggal saat ini sebagai tanggal permintaan.
Lihat Semua Pesan
Pertama, mari kita lihat pesan apa yang ada di msdb basis data.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Hasil:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Saya tidak mengembalikan semua kolom untuk tampilan ini, karena akan ada terlalu banyak data untuk ditampilkan di sini.
Hapus Pesan Lama
Untuk menghapus semua pesan yang dikirim sebelum tanggal tertentu, gunakan @sent_before
argumen.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = '2020-08-25';
Hasil:
(4 rows affected)
Perhatikan bahwa sysmail_delete_mailitems_sp
prosedur sebenarnya menghapus email berdasarkan send_request_date
daripada sent_date
. Itu sebabnya saya menggunakan send_request_date
saat melihat pesan email.
Lihat Semua Pesan Lagi
Sekarang ketika saya menanyakan sysmail_allitems
lihat, empat baris pertama telah menghilang.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Hasil:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Hapus Pesan yang Gagal
Untuk menghapus semua pesan dengan status tertentu, gunakan @sent_status
argumen.
Berikut ini contoh menghapus semua pesan email yang gagal.
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_status = 'failed';
Hasil:
(2 rows affected)
Lihat Semua Pesan Lagi
Mari kita periksa sysmail_allitems
lihat lagi.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Hasil:
+---------------+---------------+-------------------------+ | 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 | +---------------+---------------+-------------------------+
Hapus Semua Pesan
Untuk menghapus semua pesan, gunakan @sent_date
argumen dengan nilai tanggal GETDATE()
.
DECLARE @GETDATE datetime
SET @GETDATE = GETDATE();
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
@sent_before = @GETDATE;
Hasil:
(3 rows affected)
Lihat Semua Pesan Lagi
Mari kita periksa sysmail_allitems
lihat lagi.
SELECT
mailitem_id,
sent_status,
send_request_date
FROM msdb.dbo.sysmail_allitems;
Hasil:
(0 rows affected)
Hapus Acara dari Database Mail Log
Perhatikan bahwa sysmail_delete_mailitems_sp
tidak menghapus entri terkait di log Database Mail. Gunakan sysmail_delete_log_sp
untuk menghapus acara dari log Database Mail.