Triggers là gì

Khi học SQL đôi khi chúng ta bắt gặp khái niệm trigger vậy có bao giờ bạn tự hỏi trigger là gì ? Nếu chưa có câu trả lời hãy theo dõi bài viết dưới đây nhé

Trigger là gì ?

Trigger là một stored procedure 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

Cú pháp của Trigger

CREATE TRIGGER tên_trigger ON tên_bảng FOR {DELETE, INSERT, UPDATE} AS câu_lệnh_sql

Trigger dùng làm gì ?

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.

Ưu, nhược điểm của TRIGGER

Ưu điểm:

  • Sử dụng Trigger để kiểm tra tính toàn vẹn của cơ sở dữ liệu.
  • Trigger có thể bắt lỗi logic ở mức cơ sở dữ liệu.
  • Có thể dùng trigger là một cách khác để thay thế việc thực hiện những công việc hẹn giờ theo lịch.
  • Trigger rất hiệu quả khi sử dụng để kiểm soát những thay đổi của dữ liệu trong bảng.

Nhược điểm:

  • Trigger chỉ là một phần mở rộng của việc kiểm tra tính hợp lệ của dữ liệu chứ không thể thay thế hoàn toàn được công việc này.
  • Trigger hoạt động ngầm trong csdl, không hiển thị ở tầng giao diện. Do đó, khó chỉ ra được điều gì xảy ra ở tầng csdl.
  • Trigger thực hiện các update lên bảng dữ liệu vì thế nó làm tăng lượng công việc lên csdl và làm cho hệ thống chạy chậm.

Ví dụ Sử dụng trigger trong SQL

Chúng ta có bảng employees:

Triggers là gì

Bây giờ, chúng ta sẽ tạo 1 TRIGGER với chức năng: lưu lại lịch sử UPDATE thông tin của mỗi EMPLOYEE Đầu tiên, chúng ta sẽ tạo một bảng mới làemployees_edit để lưu lại sự thay đổi trên bảng employee:

CREATE TABLE employees_audit ( id INT AUTO_INCREMENT PRIMARY KEY, employeeNumber INT NOT NULL, lastname VARCHAR(50) NOT NULL, changedat DATETIME DEFAULT NULL, action VARCHAR(50) DEFAULT NULL );

Tiếp theo, chúng ta hãy viết TRIGGER để thực hiện chức năng lưu lại thời điểm thay đổi của employees.

DELIMITER $$ CREATE TRIGGER before_employee_update BEFORE UPDATE ON employees FOR EACH ROW BEGIN INSERT INTO employees_edit SET action = 'update', employeeNumber = OLD.employeeNumber, lastname = OLD.lastname, changedat = NOW(); END$$ DELIMITER ;

Trong thân của cú pháp TRIGGER, chúng ta sử dụng từ khóa OLD để truy cập vào hàng của cột employeeNumber và lastname bị ảnh hưởng bới TRIGGER. Lưu ý, với TRIGGER định nghĩa cho INSERT, bạn chỉ có thể sử dụng từ khóa NEW. Tuy nhiên, TRIGGER cho DELETE không có hàng mới nào nên chỉ có thể sử dụng từ khóa OLD. Với TRIGGER cho hàm UPDATE, OLD dùng để đề cập đến hàng trước khi được cập nhật, NEW đề cập đến hàng sau khi được cập nhật. Để xem tất cả các TRIGGER có trong cơ sở dữ liệu của bạn, sử dụng:

SHOW TRIGGERS;

Chúng ta hãy bắt đầu cập nhật bảng employees để kiểm tra TRIGGER vừa được định nghĩa:

UPDATE employees SET lastName = 'Phan' WHERE employeeNumber = 1056;

Để kiểm tra xem TRIGGER đã được thực hiện hay chưa, bạn có thể truy vấn trên bảng employees_edit:

SELECT * FROM employees_edit;

Kết quả truy vấn trả về:

Triggers là gì

Trigger đã được thực hiện và nó đã chèn một bản ghi mới vào bảng employees_edit.

Trigger là một thủ tục SQL được thực thi ở phía server khi có một sự kiện như Insert, Delete, hay Update. Trigger là một loại stored procedure đặc biệt (không có tham số) được thực thi (execute) một cách tự động khi có một sự kiện thay đổi dữ liệu (data modification). Trigger được lưu trữ và quản lý trong Server DB, được dùng trong trường hợp ta muốn kiểm tra các ràng buộc toàn vẹn trong DB.

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).

Mỗi table thường sẽ có 3 thao tác làm thay đổi dữ liệu đó là: UPDATE, INSERT, DELETE. Và đôi khi mỗi hành động như vậy ta sẽ có những ràng buộc trên bảng để giúp bảo toàn dữ liệu, lúc này sử dụng trigger là một giải pháp tốt. Ví dụ bạn thiết kế cho bảng product và category, trong đó product sẽ có một column tên là total_product dùng để lưu trữ tổng số sản phẩm của category đó. Khi thêm một product thì ta phải tăng column đó lên một đơn vị. Khi update phải kiểm tra có thay đổi category không để tăng hoặc giảm cho hợp lý, khi delete thì bớt đi một. Việc này hoàn toàn có thể code bằng các ngôn ngữ đang sử dụng SQL Server, tuy nhiên bạn có thể sử dụng trigger để giúp hệ thống dữ liệu hoạt động tốt hơn.

Ưu và nhược điểm của Trigger

Ưu điểm của Trigger

  • Trigger có thể bắt lỗi business logic ở mức csdl.
  • Có thể dùng trigger là một cách khác để thay thế việc thực hiện những công việc hẹn giờ theo lịch.
  • Trigger rất hiệu quả khi được sử dụng để kiểm soát những thay đổi của dữ liệu trong bảng.

Nhược điểm của Trigger

  • Trigger chỉ là một phần mở rộng của việc kiểm tra tính hợp lệ của dữ liệu chứ không thay thế được hoàn toàn công việc này.
  • Trigger hoạt động ngầm ở trong csdl, không hiển thị ở tầng giao diện. Do đó, khó chỉ ra được điều gì xảy ra ở tầng csdl.
  • Trigger thực hiện các update lên bảng dữ liệu vì thế nó làm gia tăng lượng công việc lên csdl và làm cho hệ thống chạy chậm lại.

Cú pháp của Trigger

Để tạo một Trigger, bạn sử dụng câu lệnh CREATE TRIGGER:

CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW BEGIN ... END;

Trong đó:

Triggers là gì

  • 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à 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ụ

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.

Tìm việc làm SQL lương cao hấp dẫn cho bạn tại Topdev.

Tham Khảo:

  • SQL Injection là gì? Cách giảm thiểu và phòng ngừa 
  • https://www.geeksforgeeks.org/sql-trigger-student-database/