Trong quá trình vận hành hệ thống, có những lúc bạn muốn một hành động nào đó tự động xảy ra khi dữ liệu trong cơ sở dữ liệu thay đổi — chẳng hạn như tự động cập nhật log, kiểm tra ràng buộc, hoặc gửi thông báo. Thay vì viết mã xử lý ở phía ứng dụng, Trigger (hay còn gọi là “trình kích hoạt”) cho phép bạn thực hiện điều đó trực tiếp trong SQL.
Hiểu và sử dụng Trigger giúp bạn tăng tính tự động hóa, đảm bảo dữ liệu luôn được xử lý đúng cách ngay tại tầng cơ sở dữ liệu, mà không phải phụ thuộc hoàn toàn vào code PHP hay JavaScript phía trên.
Trigger là gì?
Trigger là một đoạn mã SQL được kích hoạt tự động khi một sự kiện nào đó xảy ra trên một bảng dữ liệu nhất định. Các sự kiện đó thường là:
INSERT
: Khi thêm một bản ghi mới.UPDATE
: Khi cập nhật một bản ghi.DELETE
: Khi xóa một bản ghi.
Trigger hoạt động trước (BEFORE) hoặc sau (AFTER) sự kiện xảy ra, tùy vào mục đích sử dụng của bạn.
Cú pháp tạo Trigger
CREATE TRIGGER ten_trigger
[BEFORE | AFTER] [INSERT | UPDATE | DELETE]
ON ten_bang
FOR EACH ROW
BEGIN
-- Các lệnh SQL cần thực thi
END;
Giải thích:
BEFORE
hoặcAFTER
: Thực thi trigger trước hoặc sau khi sự kiện xảy ra.FOR EACH ROW
: Trigger được gọi mỗi khi có một dòng bị ảnh hưởng.- Trong khối
BEGIN...END
là nơi bạn viết logic xử lý.
Ví dụ 1: Tự động ghi log khi thêm đơn hàng mới
Giả sử bạn có 2 bảng: orders
và order_logs
. Mỗi khi có đơn hàng mới, bạn muốn tự động ghi log.
CREATE TRIGGER log_new_order
AFTER INSERT ON orders
FOR EACH ROW
BEGIN
INSERT INTO order_logs(order_id, created_at)
VALUES (NEW.id, NOW());
END;
Giải thích:
NEW.id
: Truy cập ID của đơn hàng mới được thêm.NOW()
: Ghi thời gian hiện tại.- Trigger này giúp bạn không cần viết thêm code ở backend để ghi log nữa, vì mọi thứ đã được xử lý tự động ở tầng cơ sở dữ liệu.
Ví dụ 2: Không cho cập nhật giá trị âm
Bạn có bảng products
, và muốn đảm bảo rằng không ai được phép cập nhật giá sản phẩm về số âm.
CREATE TRIGGER prevent_negative_price
BEFORE UPDATE ON products
FOR EACH ROW
BEGIN
IF NEW.price < 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Giá sản phẩm không được âm';
END IF;
END;
Giải thích:
NEW.price
: Là giá trị mới bạn đang cập nhật.SIGNAL SQLSTATE
: Dùng để ném lỗi, chặn không cho cập nhật nếu điều kiện không đúng.
Khi nào nên dùng Trigger?
- Khi bạn muốn xử lý tự động ở tầng cơ sở dữ liệu.
- Khi cần kiểm tra logic nghiệp vụ độc lập với ứng dụng.
- Khi cần đồng bộ bảng log, nhật ký, lịch sử.
Tuy nhiên, cẩn thận khi lạm dụng Trigger, vì:
- Dễ gây khó kiểm soát nếu viết quá nhiều logic phức tạp.
- Làm chậm hiệu suất nếu dùng sai chỗ.
- Gây lỗi khó debug vì hoạt động “ẩn” trong nền.
Tổng kết
Trigger là một công cụ mạnh trong SQL, giúp bạn tự động hóa xử lý khi dữ liệu thay đổi. Với Trigger, bạn có thể:
- Ghi log, kiểm tra dữ liệu, hoặc tạo các hành động phụ trợ.
- Bảo vệ dữ liệu ở tầng sâu nhất — ngay trong CSDL.
Tuy nhiên, hãy dùng Trigger đúng cách, rõ ràng, và không quá phụ thuộc vào nó. Trong bài tiếp theo, chúng ta sẽ cùng tìm hiểu một cơ chế thú vị khác: View – Tạo bảng ảo từ câu truy vấn SELECT.
Thảo luận