Tags:

SQL | Trigger – Hướng dẫn tạo Trigger trong SQ

 

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ặc AFTER. 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óa BEFORE 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à INSERTUPDATEDELETE.
  • 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ị totalper 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

https://www.geeksforgeeks.org/sql-trigger-student-database/

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x