CodeGym /Các khóa học /SQL SELF /Tạo trigger và procedure

Tạo trigger và procedure

SQL SELF
Mức độ, Bài học
Có sẵn

Bạn đã làm ngon lành mấy bài trước chưa? Nếu rồi thì mình cho bạn thử thách khó hơn chút nhé. Giờ mình sẽ giúp bạn ôn lại kiến thức về PL-SQL và viết procedure với trigger. Sẵn sàng chưa?

Tạo procedure

Dưới đây là các procedure mà mình khuyên bạn nên thêm vào database của marketplace. Mỗi procedure đều có giải thích về nhiệm vụ và quy trình kinh doanh mà nó giải quyết, cũng như lý do nên triển khai. Mấy procedure này giúp tự động hóa các thao tác chính, tăng trải nghiệm người dùng, tối ưu vận hành gian hàng, logistics, support, marketing và analytics.

1. Tạo đơn hàng với tự động giữ hàng trong kho

Tạo đơn hàng là thao tác cốt lõi của bất kỳ marketplace nào. Procedure này không chỉ tạo record đơn hàng và các item, mà còn giữ hàng trong kho, trừ số lượng, cập nhật trạng thái, khởi tạo thanh toán và chạy các quy trình tiếp theo (gửi thông báo, logistics). Tự động hóa giúp giảm lỗi nhập tay, tránh over-selling và đảm bảo tồn kho luôn đồng bộ real-time.

2. Tự động bổ sung hàng tồn kho

Để tránh out-of-stock và mất doanh thu, cần bổ sung hàng kịp thời nếu tồn kho xuống dưới ngưỡng. Procedure này kiểm tra tồn kho tất cả sản phẩm, so với mức tối thiểu và tự động tạo yêu cầu nhập hàng hoặc resupply nội bộ. Tự động hóa giúp phản ứng nhanh và giảm gánh nặng cho team vận hành.

3. Cập nhật trạng thái đơn hàng hàng loạt và gửi thông báo cho khách

Trong catalog, thường phải chuyển trạng thái đơn hàng hàng loạt (ví dụ, “paid” → “shipped” hoặc “shipped” → “completed”) tùy giai đoạn xử lý. Procedure này cập nhật trạng thái cho tất cả đơn phù hợp, ghi lại lịch sử thay đổi (để audit) và có thể gửi thông báo cho khách. Tự động hóa giúp back-office làm việc nhanh, giảm lỗi nhập tay.

4. Áp dụng hàng loạt khuyến mãi/promocode cho sản phẩm

Đẩy sản phẩm hoặc chạy campaign thường cần áp dụng hàng loạt promocode và giảm giá cho cả category, brand hoặc tập sản phẩm. Procedure này tự động set giảm giá, kiểm tra điều kiện (ngày, giới hạn), cập nhật số lần dùng và tránh trùng lặp.

5. Tự động hoàn tiền cho người dùng

Xử lý hoàn trả và hoàn tiền là quy trình cực kỳ quan trọng để giữ niềm tin khách hàng. Procedure này kiểm tra trạng thái đơn, validate hoàn trả, khởi tạo hoàn tiền, cập nhật trạng thái, ghi log giao dịch và gửi thông báo cho user. Gom hết điều kiện vào một transaction giúp giảm lỗi và tránh bị lạm dụng.

6. Tính lại điểm đánh giá trung bình của sản phẩm / seller

Mỗi khi có review mới, sửa hoặc xóa, điểm trung bình của sản phẩm hoặc user phải luôn cập nhật. Procedure này tính lại và update trường “avg_rating”/“review_count” để tăng tốc query phía frontend và đảm bảo analytics luôn chuẩn.

7. Tự động ẩn (deactivate) sản phẩm hết hàng

Để gian hàng chạy mượt và tránh khách gặp trải nghiệm xấu, sản phẩm hết hàng phải tự động ẩn (deactivate). Procedure này thường xuyên kiểm tra kho và trạng thái sản phẩm, chuyển trạng thái sang “inactive”, ghi log thay đổi và giúp catalog luôn chuẩn mà không cần check tay.

8. Tự động gán đơn hàng cho shipper và cập nhật trạng thái giao hàng

Trong logistics, việc gán shipper cho đơn và cập nhật trạng thái giao hàng phải nhanh và minh bạch, ghi lại mọi thao tác để tracking. Procedure này tự động hóa các bước đó, loại bỏ thao tác tay của manager.

9. Gửi thông báo hàng loạt cho user (trigger campaign, nhắc nhở)

Thông báo về sale, hoàn tiền, thay đổi trạng thái hoặc campaign marketing cần gửi hàng loạt, theo điều kiện (user active, lâu không mua, bỏ giỏ hàng, v.v.). Procedure này cho phép gửi push/email cho segment chỉ định.

10. Lưu trữ dữ liệu cũ (ví dụ, đơn đã hoàn thành hoặc sản phẩm không còn hoạt động)

Để database chạy nhanh và giảm tải cho bảng “nóng”, các record cũ (đơn hàng cũ, sản phẩm archive, ticket support cũ) nên định kỳ chuyển đi hoặc đánh dấu “archive”. Procedure này giúp xóa hoặc chuyển dữ liệu dễ dàng, giảm việc tay cho admin.

Tạo trigger

1. Ghi log thay đổi trạng thái đơn hàng

Lưu lịch sử thay đổi trạng thái đơn là cực kỳ quan trọng cho audit, support, analytics và tự động gửi thông báo cho user về tiến trình đơn. Trigger này tự động tạo record trong "order".order_status_log mỗi khi trạng thái đơn thay đổi, giúp dev không phải tự ghi log ở app.

2. Tự động ghi lịch sử thay đổi giá của variant sản phẩm

Lịch sử giá SKU cần cho analytics, hiển thị "giá cũ", tracking campaign và tự động gửi thông báo giảm giá. Trigger này ghi lại mỗi lần trường price trong bảng product.variant thay đổi vào lịch sử product.price_history. Nhờ vậy lưu được toàn bộ biến động giá mà không bị sót.

3. Đồng bộ tồn kho khi thay đổi sản phẩm trong kho

Mỗi lần thay đổi tồn kho (ví dụ, kiểm kê, nhập hàng, xuất kho) phải tự động update trường last_updated để analytics và kiểm soát dữ liệu luôn chuẩn. Trigger này cũng có thể tự kiểm tra ngưỡng tối thiểu và tạo đơn nhập hàng tự động.

4. Tự động deactivate variant sản phẩm hết hàng

Để tránh khách mua phải hàng hết, khi tồn kho về 0 ở tất cả kho thì trường is_active của variant tự động chuyển sang FALSE. Nhờ vậy giảm review xấu và đơn bị hủy.

5. Ghi log các lần đăng nhập admin (bảo mật)

Kiểm soát đăng nhập admin là chìa khóa bảo mật thông tin. Mọi lần đăng nhập (thành công và thất bại) đều tự động ghi vào admin.login_attempt qua trigger BEFORE INSERT. Nhờ đó dễ phát hiện tấn công, hack hoặc hoạt động bất thường.

6. Ghi log thay đổi quan trọng của sản phẩm và tự động lưu lịch sử

Mọi chỉnh sửa quan trọng của sản phẩm (trạng thái, mô tả, tên) đều phải lưu lại để audit thao tác nhân viên, khôi phục lỗi và kiểm soát lạm dụng. Trigger này tạo record trong product.status_history khi trạng thái thay đổi và có thể mở rộng cho các trường khác.

7. Tự động cập nhật số lần sử dụng promocode

Ghi nhận số lần dùng promocode chuẩn là cần thiết để giới hạn campaign và tránh lạm dụng. Trigger này mỗi lần insert vào marketing.promo_usage sẽ tăng trường used_count trong marketing.promo_code, tránh lệch dữ liệu.

8. Cập nhật số dư ví user khi có giao dịch

Để hiển thị số dư ví thưởng/cashback chuẩn, mỗi giao dịch phải tự động cập nhật số dư cuối cùng trong bảng payment.wallet. Trigger khi insert giao dịch mới giúp giảm nguy cơ mất hoặc sai dữ liệu do lỗi app.

9. Tự động set "chính" cho địa chỉ, email hoặc số điện thoại

Để tránh trường hợp user không có email/số điện thoại/địa chỉ chính (cực kỳ quan trọng để khôi phục truy cập và liên lạc), trigger tự động set flag is_primary=TRUE cho record đầu tiên nếu chưa có, và đảm bảo chỉ có một record chính cho mỗi user.

10. Tính lại điểm trung bình sản phẩm khi có review mới

Để hiển thị "điểm trung bình" nhanh trên card sản phẩm và khi search, update giá trị này mỗi khi có review mới sẽ hiệu quả hơn là query aggregate liên tục. Trigger này duy trì cache trường avg_rating và/hoặc review_count trong bảng product.product.

11. Tự động set ngày đăng cho nội dung

Với bài viết, page hoặc nội dung khác, khi đổi trạng thái sang "published" thì cần tự động điền trường published_at. Nhờ vậy CMS luôn chuẩn: user và admin đều thấy đúng ngày đăng, frontend không cần update tay.

12. Ghi log mọi sự kiện support (thay đổi trạng thái ticket)

Lưu lịch sử support và thay đổi trạng thái ticket giúp đánh giá hiệu quả support, làm analytics và minh bạch với user. Trigger này tự động ghi record vào support.ticket_status_log khi ticket đổi trạng thái.

Lưu ý

Thêm các trigger này sẽ tăng mạnh độ tin cậy, minh bạch và tự động hóa các quy trình kinh doanh chính của marketplace, giảm tải cho code app và đảm bảo dữ liệu luôn chuẩn ngay trong database. Đây là best practice khi thiết kế hệ thống quan hệ cho e-commerce lớn.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION