Hôm nay mình sẽ viết về một chủ đề hứa hẹn sẽ thú vị với bạn. Đó là trigger trong SQL.
Hiểu nôm na thì đây là giải pháp tự động phát hiện có hành động làm thay đổi dữ liệu trên Table , ví dụ: Insert, update, delete
… Từ đó mà bạn có hành động tương ứng nào đó, phổ biến nhất là ghi log lại.
Nội dung chính của bài viết
Giới thiệu SQL Triggers là gì?
Trigger là một stored procedure không có tham số, được thực thi một cách tự động mỗi khi một table (được thiết lập trigger) bị thay đổi dữ liệu.
Một trigger luôn được gắn với một table cụ thể. Nếu table đó bị xóa thì chắc chắn trigger đó cũng bị xóa theo.
Một trigger có thể được gọi trước hoặc sau khi thực hiện các câu lệnh:
INSERT
: Thêm một record vàoUPDATE
: Cập nhật dữ liệu của một record.DELETE
: Xóa một record.
Nếu chiếu theo ngôn ngữ lập trình, ví dụ như Javascript thì nó giống với các Event vậy. Giả sử, người dùng click vào một nút nào đó, mà nút được thiết lập một event là onClick. Khi đó event onClick được gọi và thực thi logic trong event đó. Ví dụ: submit dữ liệu lên server…
Cách tạo Trigger
Để tạo trigger trong SQL cho một table nào đó, bạn có thể sử dụng đoạn mã sau:
CREATE TRIGGER trigger_name [BEFORE|AFTER] event ON table_name trigger_type BEGIN -- trigger logic -- phần logic mà bạn muốn thực hiện khi trigger được gọi END;
Mình sẽ giải thích cụ thể hơn các câu lệnh ở trên:
- Đầu tiên là đặt tên trigger sau câu lệnh:
CREATE TRIGGER
- Sau đó, xác định trigger nên được gọi trước hay sau khi phát hiện có hành động thay đổi dữ liệu trên table:
BEFORE
hoặcAFTER
- Tiếp theo là chỉ định tên table gán với trigger này.
- Cuối cùng là phần logic của bạn khi trigger được gọi. Bạn thực hiện trong khối BEGIN…END
Ngoài ra, bạn có thể gọi một store procudure thay vì viết trực tiếp các câu lệnh SQL trong khối logic BEGIN...END
. Sử dụng câu lệnh execute
Ví dụ:
CREATE TRIGGER trigger_name [BEFORE|AFTER] event ON table_name trigger_type EXECUTE stored_procedure_name;
Trigger nên sử dụng trong trường hợp nào?
Về cơ bản, trigger có thể được sử dụng trong rất nhiều tình huống, tùy vào yêu cầu nghiệp vụ của phần mềm.
Dưới đây là một số tình huống hay sử dụng nhất:
- Ghi log khi có bất cứ thay đổi dữ liệu nào trong bảng. Có một table chứa thông tin cá nhân nhạy cảm như email khách hàng, lương nhân viên.v.v… Hệ thống muốn truy vết, lưu lại tất cả các lịch sử thay đổi. Trong trường hợp này, bạn có thể tạo trigger cho hành động
UPDATE
và lưu lại thay đổi vào một bảng log nào đó. - Cần đảm bảo dữ liệu chuẩn xác. Trong trường hợp này, bạn có thể tạo trigger để validate dữ liệu, thậm chí cập lại định dạng dữ liệu trước khi thực sự lưu vào table.
Ví dụ một bài toán sử dụng Trigger trong SQL
Chúng ta có bảng employees với các column như sau:
Giả sử chúng ta muốn ghi lại những thay đổi giá trị của cột lương (salary).
Để làm được điều này, chúng ta sẽ tạo một bảng log, có tên là: salary_changes và một trigger để thực hiện lưu log vào bảng này.
Trước hết là tạo bảng salary_changes bằng đoạn mã sau:
CREATE TABLE salary_changes ( employee_id INT, changed_at DATETIME DEFAULT CURRENT_TIMESTAMP, old_salary DECIMAL(8 , 2 ), new_salary DECIMAL(8 , 2 ), PRIMARY KEY (employee_id , changed_at) );
Bảng này sẽ lưu lại những thông tin gì? Đó là mã nhân viên (employee_id), lương cũ (old_salary), lương mới cập nhật (new_salary) và thời gian cập nhật lương mới (changed_at)
Tiếp theo là tạo trigger:
CREATE TRIGGER before_update_salary BEFORE UPDATE ON employees FOR EACH ROW BEGIN IF NEW.salary <> OLD.salary THEN INSERT INTO salary_changes(employee_id,old_salary,new_salary) VALUES(NEW.employee_id,OLD.salary,NEW.salary); END IF; END;
Vậy là xong phần cài đặt rồi đấy. Giờ chúng ta sẽ tiến hành kiểm tra.
Thử query lấy thông tin lương của một nhân viên bất kỳ. Ví dụ, nhân viên có mã 110.
SELECT employee_id, first_name, last_name, salary FROM employees WHERE employee_id = 110;
Sau đó, tăng lương nhân viên này lên 5%.
UPDATE employees SET salary = salary * 1.05 WHERE employee_id = 110;
Thử kiểm tra bảng log xem nó có ghi log như ý đồ của mình không nhé.
SELECT * FROM salary_changes;
Vậy là OK rùi đấy.
Tạm kết
Trên là những kiến thức cơ bản nhất về trigger trong SQL, nó rất hữu ích trong nhiều trường hợp.
Tất nhiên, trigger cũng chỉ là công cụ hỗ trợ bạn giải quyết một bài toán nào đó. Hãy sử dụng nó một cách thông minh!
💥 Đọc thêm về Database:
Bình luận. Cùng nhau thảo luận nhé!