Mục lục
Trigger là một stored procedure được chạy tự động dựa trên những sự kiện mà nó được đăng ký. Khi các sự kiện này xảy ra trong database, thì nó cũng sẽ được thực thi. Ví dụ như một trigger có thể được gọi khi có một dòng dữ liệu được thêm vào một table, hay một số cột trong bảng bị thay đổi.
Cú pháp để tạo một trigger trong sql
create trigger [trigger_name] [before | after] {insert | update | delete} on [table_name] [for each row] [trigger_body]
Trong đó:
- create trigger [trigger_name]: Khởi tạo hoặc thay thế một trigger mới với tên là trigger_name.
- [before | after]: Thời điểm chạy trigger.
- {insert | update | delete}: các sự kiện mà trigger sẽ được thực thi khi chúng xảy ra.
- on [table_name] bảng mà trigger sẽ lắng nghe các sự kiện tương ứng được liệt kê ở trên.
- [for each row ]Điều này chỉ định trình kích hoạt cấp hàng, tức là trình kích hoạt sẽ được thực thi cho mỗi hàng bị ảnh hưởng.
- [trigger_body]: các câu lệnh sql được thực thi bên trong trigger.
Trigger được sử dụng khi nào?
- Trigger thường được sử dụng để kiểm tra ràng buộc (check constraints) trên nhiều quan hệ (nhiều bảng/table) hoặc trên nhiều dòng (nhiều record) của bảng.
- Ngoài ra việc sử dụng Trigger để chương trình có những hàm chạy ngầm nhằm phục vụ nhưng trường hợp hữu hạn và thường không sử dụng cho mục đích kinh doanh hoặc giao dịch.
- Ngăn chặn việc xóa những dữ liệu quan trọng. (có thể dùng back up các dữ liệu quan trọng sang table khác phòng khi …bị xóa ngoài ý muốn).
Ví dụ cho Student database, khi điểm của Student được thêm vào, chúng ta có nhiệm vụ tính tổng điểm và trung bình cộng cho mỗi Student ở cộng total và per tương ứng.
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 | | +-------+-------------+----
Trigger dưới đây sẽ thực thi trước khi một lệnh INSERT hay UPDATE Student được thực thi
create trigger stud_marks before INSERT, UPDATE on Student for each row set Student.total = Student.subj1 + Student.subj2 + Student.subj3, Student.per = Student.total * 60 / 100;
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)
Như vậy chúng ta sẽ không cần phải tính toán thủ công giá trị cho total và per mỗi khi có một Student được thêm vào hay được cập nhật.
Nguồn tham khảo