Trigger có thể hiểu nhanh là một công đoạn hẹn giờ thực thi SQL, được chạy từ server mỗi khi có các sự kiện Insert, Delete, hay Update.
Tuy nhiên khác với Stored Procedure, Trigger hoàn toàn không có tham số. Và ta không thể gọi thực hiện trực tiếp Trigger bằng lệnh EXECUTE như Strore Procedure hay bất kì lệnh nào khác. Trigger chỉ có thể chạy một cách tự động. Trigger được lưu trữ trong DB Server và thường hay được dùng để kiểm tra ràng buộc toàn vẹn dữ liệu, hay thực hiện tính toán một số dữ liệu dựa trên các dữ liệu khác có sẵn .
Sử dụng Trigger
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW BEGIN ... END;
Trong đó:
- Một Trigger được khởi tạo sau câu lệnh
CREATE TRIGGER
. Quy tắc đặt tên nên tuân theo nguyên tắc:[trigger time]_[table name]_[trigger event]
, ví dụbefore_employees_update
. - Thời gian kích hoạt :
BEFORE
hoặcAFTER
. Cần phải chỉ định thời gian kích hoạc khi bạn xác định được tiến trình kích hoạt của nó. Sử dụng từ khóaBEFORE
nếu bạn muốn xử lý
hành động trước khi thực hiện thay đổi trên bản vàAFTER
nếu bạn cần phải xử lý hành động sau khi thay đổi được thực hiện xong. - Sự kiện gây ra có thể là
INSERT
,UPDATE
,DELETE
. - Trình kích hoạt phải được liên kết với một bảng cụ thể, sử dụng từ khóa
ON
để xác định. - Câu lệnh SQL phải được đặt giữa từ khóa
BEGIN
vàEND
.
Ví dụ chúng ta có một bảng Student , trong này chúng ta sẽ tiến hành tạo một trigger dùng để tính tổng điểm và trung bình cộng của các sinh viên.
mysql> desc Student; +-------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+----------------+ | tid | int(4) | NO | PRI | NULL | auto_increment | | name | varchar(30) | YES | | NULL | | | subj1 | int(2) | YES | | NULL | | | subj2 | int(2) | YES | | NULL | | | subj3 | int(2) | YES | | NULL | | | total | int(3) | YES | | NULL | | | per | int(3) | YES | | NULL | | +-------+-------------+------+-----+---------+----------------+ 7 rows in set (0.00 sec)
Trong bảng điểm, khi Insert thì chúng ta sẽ tiến hành tính lại giá trị total và per theo công thức tương ứng.
create trigger stud_marks before INSERT on Student for each row set Student.total = Student.subj1 + Student.subj2 + Student.subj3, Student.per = Student.total * 60 / 100;
Sau khi thực thi đoạn code trên thì SQL sẽ tạo ra một Trigger trong database, bất cứ khi nào một dòng dữ liệu được Insert vào bảng Student thì dữ Trigger này sẽ được kích hoạt.
mysql> insert into Student values(0, "ABCDE", 20, 20, 20, 0, 0); Query OK, 1 row affected (0.09 sec) mysql> select * from Student; +-----+-------+-------+-------+-------+-------+------+ | tid | name | subj1 | subj2 | subj3 | total | per | +-----+-------+-------+-------+-------+-------+------+ | 100 | ABCDE | 20 | 20 | 20 | 60 | 36 | +-----+-------+-------+-------+-------+-------+------+ 1 row in set (0.00 sec)
Nguồn tham khảo