I. Khái niệm

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 không cần chờ phía client gọi hoặc là xảy ra ở phía server SAU KHI có các events Inser, 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.

II. Sử dụng 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ặ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.

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ộ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 UPDATEOLDdù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ề:

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

IV. Tại sao ta nên sài 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.
Chia sẻ
Bài trướcXcode9 và những tính năng, thay đổi mới
Bài tiếp theoAndroid scan QRCode và Barcode bằng barcodescanner – tích hợp kiểm tra mã vạch cho di động
Tôi là một lập trình viên thiết kế website và sau này là cả IOS ( Android thì chỉ biết sơ sơ ) Tôi đã bắt đầu thực hiện dự án Freelancer đầu tay của mình vào năm 2009 khi tôi lần đầu đi làm. Và với những đánh giá tích cực của khách hàng ban đầu vì hỗ trợ tốt, hậu mãi tốt và tự chủ động tìm hiểu/update thêm tính năng cho khách hàng nên tôi đã nhận được nhiều hợp đồng hơn sau đó. Kết quả là vào năm 2011 tôi đã thành lập Mona Media với chỉ 2 nhân viên thời gian đầu. Tôi tự hào về kinh nghiệm, kiến thức và sự nhiệt thành của mình trong mỗi dự án của khách hàng. Mona Media lựa chọn phân khúc của sự hiệu quả, không sáo rỗng, không màu mè, chúng tôi chỉ tập trung mang lại những giá trị hoàn hảo cho khách hàng qua website/phần mềm.