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.