TRIGGER trong SQL
Bài đăng này đã không được cập nhật trong 3 năm
Hôm nay, mình xin giới thiệu với các bạn về 1 kỹ thuật trong SQL là Trigger. Vậy nó là gì, nó có tác dụng gì, và sử dụng nó như thế nào?
I. Khái niệm
Trigger có thể hiểu đơn giản là một thủ tục SQL được thực thi ở phía server khi có một sự kiện như Inser, Delete, hay Update. Tuy nhiên khác với Stored Procedure, Trigger hoàn toàn không có tham số. Chúng ta không thể gọi thực hiện trực tiếp Trigger bằng lệnh EXECUTE như Strore Procedure hoặc bằng bấy kỳ một lệnh nào khác. Thay vào đó Trigger sẽ được thực hiện một cách tự động. Trigger được lưu trữ và quản lý trong Server Database, đượ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 Database.
II. 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 đó:
- 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
.
III. Ví dụ
Chúng ta có bảng employees
:
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ộtemployeeNumber
vàlastname
bị ảnh hưởng bới TRIGGER. Lưu ý, với TRIGGER định nghĩa choINSERT
, bạn chỉ có thể sử dụng từ khóaNEW
. Tuy nhiên, TRIGGER choDELETE
không có hàng mới nào nên chỉ có thể sử dụng từ khóaOLD
. Với TRIGGER cho hàmUPDATE
,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ề:
Trigger đã được thực hiện và nó đã chèn một bản ghi mới vào bảng employees_edit
.
IV. Ư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.
All rights reserved