Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Hapus Pesan Email Database dari Database msdb di SQL Server (T-SQL)

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Membuat, tidak merusak, kinerja SQL Server

  2. Periksa Status Semua Pesan Database Database di SQL Server (T-SQL)

  3. Apa itu Fungsi Bernilai Tabel di SQL Server?

  4. Cara Memperbaiki "Permintaan TRANSAKSI KOMIT tidak memiliki TRANSAKSI AWAL yang sesuai" di SQL Server

  5. Berbagai Cara untuk Memantau Grup Ketersediaan AlwaysOn SQL Server