Cafedev chia sẻ cho ace về trigger, nó là gì? khi nào dùng nó, hoặc nó hoạt động như thế nào trong sql server thông qua khái niệm và các ví dụ sau đây.

1.Trigger là gì?

Trigger: Trigger là một thủ tục được lưu trữ trong cơ sở dữ liệu, thủ tục này tự động gọi bất cứ khi nào một sự kiện đặc biệt trong cơ sở dữ liệu xảy ra. Ví dụ: một trigger có thể được gọi khi một hàng được chèn vào một bảng được chỉ định hoặc khi một số cột bảng nhất định đang được cập nhật.

Trigger là một stored procedure(hàm thủ tục) không có tham số. Trigger thực thi một cách tự động khi một trong ba câu lệnh Insert, Update, Delete làm thay đổi dữ liệu trên bảng có chứa trigger.

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.

Ví dụ một chi tiết hoá đơn không được nhiều hơn 10 hoá đơn (tức là trong bảng CTHD không được vượt quá 10 SoHD)

Cú pháp

create trigger [trigger_name] 
[before | after]  
{insert | update | delete}  
on [table_name]  
[for each row]  
[trigger_body] 

Giải thích cú pháp:

  • create trigger [trigger_name]: Tạo hoặc thay thế một trigger hiện có bằng trigger_name.
  • [before | after]: Điều này chỉ định thời điểm trình kích hoạt sẽ được thực thi.
  • {insert | update | delete}: Điều này chỉ định hoạt động DML.
  • on [table_name]: Điều này chỉ định tên của bảng được liên kết với trigger.
  • [for each row]: Điều này chỉ định trigger cấp hàng, tức là trigger sẽ được thực thi cho mỗi hàng bị ảnh hưởng
  • [trigger_body]: Điều này cung cấp hoạt động được thực hiện khi trigger được kích hoạt

DML là viêt tắt của Data Manipulation Language( ngôn ngữ thao tác dữ liệu)cho phép thực thi các câu truy vấn,bao gồm cú pháp để cập nhật – sửa đổi, chèn thêm và xoá các mẩu tin.

2. BEFORE and AFTER of Trigger:

BEFORE khi Trigger chạy hành động kích hoạt trước khi chạy câu lệnh kích hoạt.
AFTER các Trigger chạy hành động kích hoạt sau khi chạy câu lệnh kích hoạt.

ví dụ:

-->

Cung cấp Cơ sở dữ liệu Báo cáo Học sinh, trong đó đánh giá điểm của học sinh được ghi lại. Trong lược đồ như vậy, hãy tạo một Trigger để tính tổng số và trung bình của các bảng đã chỉ định được tự động chèn bất cứ khi nào một bản ghi được chèn.

Ở đây, vì trigger sẽ gọi trước khi bản ghi được chèn, nên có thể sử dụng thẻ BEFORE.

+-------+-------------+------+-----+---------+----------------+ 
| 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    |                |
+-------+-------------+------+-----+---------+----------------+ 

Câu lệnh trigger SQL tới sự cố.

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;

Câu lệnh SQL trên sẽ tạo một trigger trong cơ sở dữ liệu sinh viên, trong đó bất cứ khi nào điểm môn học được nhập, trước khi chèn dữ liệu này vào cơ sở dữ liệu, trigger sẽ tính toán hai giá trị đó và chèn các giá trị đã nhập.

insert into Student values(0, "ABCDE", 20, 20, 20, 0, 0); 
Query OK, 1 row affected (0.09 sec) 
select * from Student; 

+-----+-------+-------+-------+-------+-------+------+ 
| tid | name  | subj1 | subj2 | subj3 | total | per  | 
+-----+-------+-------+-------+-------+-------+------+ 
| 100 | ABCDE |    20 |    20 |    20 |    60 |   36 | 
+-----+-------+-------+-------+-------+-------+------+ 

Bằng cách này, trigger có thể được tạo và thực thi trong cơ sở dữ liệu.

Full series tự học SQL từ cơ bản tới nâng cao tại đây nha.

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!