Trigger trong SQL – Hướng dẫn sử dụng qua một ví dụ điển hình

0
Dịch vụ dạy kèm gia sư lập trình

Hôm nay mình sẽ viết về một chủ đề hứa hẹn sẽ thú vị với bạn. Đó là trigger trong SQL.

Hiểu nôm na thì đây là giải pháp tự động phát hiện có hành động làm thay đổi dữ liệu trên Table , ví dụ: Insert, update, delete… Từ đó mà bạn có hành động tương ứng nào đó, phổ biến nhất là ghi log lại.

Giới thiệu SQL Triggers là gì?

Trigger là một stored procedure không có tham số, được thực thi một cách tự động mỗi khi một table (được thiết lập trigger) bị thay đổi dữ liệu.

Một trigger luôn được gắn với một table cụ thể. Nếu table đó bị xóa thì chắc chắn trigger đó cũng bị xóa theo.

Một trigger có thể được gọi trước hoặc sau khi thực hiện các câu lệnh:

  • INSERT: Thêm một record vào
  • UPDATE: Cập nhật dữ liệu của một record.
  • DELETE: Xóa một record.

Nếu chiếu theo ngôn ngữ lập trình, ví dụ như Javascript thì nó giống với các Event vậy. Giả sử, người dùng click vào một nút nào đó, mà nút được thiết lập một event là onClick. Khi đó event onClick được gọi và thực thi logic trong event đó. Ví dụ: submit dữ liệu lên server…

Cách tạo Trigger

Để tạo trigger trong SQL cho một table nào đó, bạn có thể sử dụng đoạn mã sau:

CREATE TRIGGER trigger_name [BEFORE|AFTER] event
ON table_name trigger_type
BEGIN
  -- trigger logic 
  -- phần logic mà bạn muốn thực hiện khi trigger được gọi
    
END;

Mình sẽ giải thích cụ thể hơn các câu lệnh ở trên:

  • Đầu tiên là đặt tên trigger sau câu lệnh: CREATE TRIGGER
  • Sau đó, xác định trigger nên được gọi trước hay sau khi phát hiện có hành động thay đổi dữ liệu trên table: BEFORE hoặc AFTER
  • Tiếp theo là chỉ định tên table gán với trigger này.
  • Cuối cùng là phần logic của bạn khi trigger được gọi. Bạn thực hiện trong khối BEGIN…END

Ngoài ra, bạn có thể gọi một store procudure thay vì viết trực tiếp các câu lệnh SQL trong khối logic BEGIN...END. Sử dụng câu lệnh execute

Ví dụ:

CREATE TRIGGER trigger_name 
[BEFORE|AFTER] event
ON table_name trigger_type
EXECUTE stored_procedure_name;

Trigger nên sử dụng trong trường hợp nào?

Về cơ bản, trigger có thể được sử dụng trong rất nhiều tình huống, tùy vào yêu cầu nghiệp vụ của phần mềm.

Dưới đây là một số tình huống hay sử dụng nhất:

  • Ghi log khi có bất cứ thay đổi dữ liệu nào trong bảng. Có một table chứa thông tin cá nhân nhạy cảm như email khách hàng, lương nhân viên.v.v… Hệ thống muốn truy vết, lưu lại tất cả các lịch sử thay đổi. Trong trường hợp này, bạn có thể tạo trigger cho hành động UPDATE và lưu lại thay đổi vào một bảng log nào đó.
  • Cần đảm bảo dữ liệu chuẩn xác. Trong trường hợp này, bạn có thể tạo trigger để validate dữ liệu, thậm chí cập lại định dạng dữ liệu trước khi thực sự lưu vào table.

Ví dụ một bài toán sử dụng Trigger trong SQL

Chúng ta có bảng employees với các column như sau:

Trigger trong SQL

Giả sử chúng ta muốn ghi lại những thay đổi giá trị  của cột lương (salary).

Để làm được điều này, chúng ta sẽ tạo một bảng log, có tên là: salary_changes và một trigger để thực hiện lưu log vào bảng này.

Trước hết là tạo bảng salary_changes bằng đoạn mã sau:

CREATE TABLE salary_changes (
    employee_id INT,
    changed_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    old_salary DECIMAL(8 , 2 ),
    new_salary DECIMAL(8 , 2 ),
    PRIMARY KEY (employee_id , changed_at)
);

Bảng này sẽ lưu lại những thông tin gì? Đó là mã nhân viên (employee_id), lương cũ (old_salary), lương mới cập nhật (new_salary) và thời gian cập nhật lương mới (changed_at)

Tiếp theo là tạo trigger:

CREATE TRIGGER before_update_salary
BEFORE UPDATE ON employees
FOR EACH ROW
BEGIN
   IF NEW.salary <> OLD.salary THEN
    INSERT INTO salary_changes(employee_id,old_salary,new_salary)
        VALUES(NEW.employee_id,OLD.salary,NEW.salary);
    END IF;
END;

Vậy là xong phần cài đặt rồi đấy. Giờ chúng ta sẽ tiến hành kiểm tra.

Thử query lấy thông tin lương của một nhân viên bất kỳ. Ví dụ, nhân viên có mã 110.

SELECT 
    employee_id, 
    first_name, 
    last_name, 
    salary
FROM
    employees
WHERE
    employee_id = 110;

trigger_example_select

 

Sau đó, tăng lương nhân viên này lên 5%.

UPDATE employees 
SET 
    salary = salary * 1.05
WHERE
    employee_id = 110;

trigger_exampl_update

 

Thử kiểm tra bảng log xem nó có ghi log như ý đồ của mình không nhé.

SELECT 
    *
FROM
    salary_changes;

trigger_example_select_log

 

Vậy là OK rùi đấy.

Tạm kết

Trên là những kiến thức cơ bản nhất về trigger trong SQL, nó rất hữu ích trong nhiều trường hợp.

Tất nhiên, trigger cũng chỉ là công cụ hỗ trợ bạn giải quyết một bài toán nào đó. Hãy sử dụng nó một cách thông minh!

💥 Đọc thêm về Database:

Dịch vụ phát triển ứng dụng mobile giá rẻ - chất lượng
Bài trước[Video] Học lập trình C toàn tập (10 tiếng)
Bài tiếp theoReact Native – Cách đổi tên Package name chuẩn chỉ, không lỗi
Tên đầy đủ là Dương Anh Sơn. Tốt nghiệp ĐH Bách Khoa Hà Nội. Mình bắt đầu nghiệp coder khi mà ra trường chẳng xin được việc đúng chuyên ngành. Mình tin rằng chỉ có chia sẻ kiến thức mới là cách học tập nhanh nhất. Các bạn góp ý bài viết của mình bằng cách comment bên dưới nhé !

Bình luận. Cùng nhau thảo luận nhé!

avatar
  Theo dõi bình luận  
Thông báo