Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Xóa thư cơ sở dữ liệu khỏi cơ sở dữ liệu msdb trong SQL Server (T-SQL)

Khi bạn sử dụng Thư cơ sở dữ liệu để gửi email từ SQL Server, thư email và tệp đính kèm của chúng được lưu trữ trong msdb cơ sở dữ liệu. Bạn nên định kỳ xóa các thông báo này để ngăn cơ sở dữ liệu phát triển thành lớn.

Để xóa những thư này bằng T-SQL, hãy sử dụng sysmail_delete_mailitems_sp thủ tục được lưu trữ.

Bạn có thể xóa thư dựa trên ngày yêu cầu gửi của họ (tức là trước một ngày nhất định) hoặc dựa trên trạng thái của họ. Bạn cũng có thể xóa tất cả các thư bằng cách sử dụng ngày hiện tại làm ngày yêu cầu.

Xem tất cả tin nhắn

Trước tiên, hãy xem những thông báo nào trong msdb cơ sở dữ liệu.

SELECT 
    mailitem_id,
    sent_status,
    send_request_date
FROM msdb.dbo.sysmail_allitems;

Kết quả:

+---------------+---------------+-------------------------+
| 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 |
+---------------+---------------+-------------------------+

Tôi không trả lại tất cả các cột cho chế độ xem này, vì có quá nhiều dữ liệu để trình bày ở đây.

Xóa tin nhắn cũ

Để xóa tất cả các tin nhắn đã được gửi trước một ngày nhất định, hãy sử dụng @sent_before đối số.

EXECUTE msdb.dbo.sysmail_delete_mailitems_sp   
    @sent_before = '2020-08-25';

Kết quả:

(4 rows affected)

Lưu ý rằng sysmail_delete_mailitems_sp thủ tục thực sự xóa email dựa trên send_request_date thay vì sent_date . Đó là lý do tại sao tôi đang sử dụng send_request_date khi xem các tin nhắn email.

Xem lại tất cả tin nhắn

Bây giờ khi tôi truy vấn sysmail_allitems xem, bốn hàng đầu tiên đã biến mất.

SELECT 
    mailitem_id,
    sent_status,
    send_request_date
FROM msdb.dbo.sysmail_allitems;

Kết quả:

+---------------+---------------+-------------------------+
| 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 |
+---------------+---------------+-------------------------+

Xóa tin nhắn không thành công

Để xóa tất cả các thư có trạng thái nhất định, hãy sử dụng @sent_status đối số.

Dưới đây là một ví dụ về việc xóa tất cả các thư không thành công.

EXECUTE msdb.dbo.sysmail_delete_mailitems_sp   
    @sent_status = 'failed';

Kết quả:

(2 rows affected)

Xem lại tất cả tin nhắn

Hãy kiểm tra sysmail_allitems xem lại.

SELECT 
    mailitem_id,
    sent_status,
    send_request_date
FROM msdb.dbo.sysmail_allitems;

Kết quả:

+---------------+---------------+-------------------------+
| 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 |
+---------------+---------------+-------------------------+

Xóa tất cả tin nhắn

Để xóa tất cả tin nhắn, hãy sử dụng @sent_date đối số có giá trị ngày là GETDATE() .

DECLARE @GETDATE datetime  
SET @GETDATE = GETDATE();
EXECUTE msdb.dbo.sysmail_delete_mailitems_sp
    @sent_before = @GETDATE;

Kết quả:

(3 rows affected)

Xem lại tất cả tin nhắn

Hãy kiểm tra sysmail_allitems xem lại.

SELECT 
    mailitem_id,
    sent_status,
    send_request_date
FROM msdb.dbo.sysmail_allitems;

Kết quả:

(0 rows affected)

Xóa sự kiện khỏi Nhật ký thư cơ sở dữ liệu

Lưu ý rằng sysmail_delete_mailitems_sp không xóa các mục nhập tương ứng trong nhật ký Thư cơ sở dữ liệu. Sử dụng sysmail_delete_log_sp để xóa các sự kiện khỏi nhật ký Thư cơ sở dữ liệu.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm cột phân vùng cho một bảng phân vùng trong SQL Server (T-SQL)

  2. Có cách nào để nhúng báo cáo power bi và bảng điều khiển vào ứng dụng vb.net hoặc C # trên máy tính để bàn với cơ sở dữ liệu sql server 2008 không?

  3. các lựa chọn thay thế để THAY THẾ trên kiểu dữ liệu văn bản hoặc ntext

  4. Cách nhóm theo tháng từ trường Ngày sử dụng sql

  5. Các cải tiến tempdb trong SQL Server 2019