Trigger Trong SQL Là Gì? Hướng Dẫn Sử Dụng Trigger Trong SQL

Trigger là thủ tục SQL được thực hiện ở phía máy chủ khi có bất kỳ sự kiện nào xảy ra như Insert, Update hay Delete.

Trigger là thuật ngữ thường được sử dụng trong SQL. Vì thế những ai đang có ý định học về ngôn ngữ truy vấn dữ liệu thì đừng bỏ qua các kiến thức Trigger trong SQL của bài chia sẻ sau đây nhé.

Khái niệm Trigger trong SQL là gì?

Trigger là thủ tục SQL được thực hiện ở phía máy chủ khi có bất kỳ sự kiện nào xảy ra như Insert, Update hay Delete. Ngoài ra, Trigger còn được hiểu là một stored procedure dạng đặc biệt (vì nó không có tham số) được thực thi tự động ngay khi có sự kiện làm dữ liệu bị thay đổi. Server DB là nơi lưu trữ, quản lý Trigger, và được sử dụng khi người dùng muốn kiểm tra sự ràng buộc toàn vẹn của DB.

Ba đặc điểm tạo nên sự khác biệt giữa Trigger và stored procedures:

    • Trigger được thực hiện tự động.
    • Trigger không có cơ hội nhận thông số.

  • Người dùng không thể cam kết, hay khôi phục bất kỳ transaction nào trong Trigger. 

Tuy nhiên, việc không dùng tham số trên Trigger không là một hạn chế của quá trình nhận thông tin sự kiện, và người dùng hoàn toàn có nhiều lựa chọn khác phục vụ cho hoạt động lấy thông tin từ sự kiện.

trigger trong sql

Trường hợp sử dụng Trigger trong SQL Server 

Trigger trong SQL được sử dụng trong các trường hợp sau:

  • Kiểm tra tính ràng buộc của nhiều quan hệ giữa các bảng hoặc nhiều dòng của bảng.
  • Ngăn chặn thao tác xóa các dữ liệu quan trọng.
  • Tận dụng Trigger để có các hàm chạy ngầm, phục vụ cho một số trường hợp cụ thể của người dùng.

Cú pháp tạo Trigger trong SQL cơ bản

Dưới đây là đoạn code tạo Trigger cơ bản: 

CREATE TRIGGER tên_trigger  

ON { Tên_bảng }   

[ WITH <Options> ]  

{ FOR | AFTER | INSTEAD OF }   

{ [INSERT], [UPDATE] , [DELETE] }

Cấu tạo Trigger trong SQL Server

Trigger trong SQL có 2 lớp, gồm:

  • DDL (Data Definition Language) Trigger: Là lớp có khả năng kích hoạt khi cấu trúc sự kiện bị thay đổi (như tạo mới, chỉnh sửa, loại bỏ bảng), hoặc sự kiện liên quan đến máy chủ (cập nhật thống kê, thay đổi bảo mật).
  • DML (Data Modification Language) Trigger: Loại này được dùng nhiều nhất. Đối với DML Trigger, sự kiện kích hoạt chỉ là câu lệnh sửa đổi dữ liệu (chèn, cập nhật, xóa) trên bảng.

Bên cạnh đó, DML Trigger cũng có một số loại khác như: 

- FOR,  AFTER [INSERT, UPDATE, DELETE]: Những Trigger này sẽ được thực thi khi kết thúc câu lệnh kích hoạt. 

  • INSTEAD OF [INSERT, UPDATE, DELETE]: Ngược lại với Trigger FOR (AFTER), Trigger này được sử dụng để thực thi lệnh kích hoạt. Điều này có nghĩa, nó được dùng thay cho câu lệnh kích hoạt. Loại Trigger này cực kỳ quan trọng và hữu ích. Bởi nó giúp người dùng có thể tham chiếu chéo toàn vẹn đến các dữ liệu. 
  • trigger trong sql

Vai trò của Trigger trong SQL Server là gì?

Mối quan hệ của dữ liệu (relational databases) có đặc điểm cơ bản là tính nhất quán. Điều này được hiểu là tất cả thông tin lưu trữ trong database phải nhất quán với các session, transaction. Vì thế, để thực hiện tính nhất quán này, SQL Server phải thực thi sự ràng buộc giữa các primary key và foreign key.

Ngoài ra, trong SQL Server, khi 2 bảng nằm trên 2 database hoặc máy chủ khác nhau thì việc thực thi tính toàn vẹn tham chiếu giữa chúng bằng foreign key sẽ không thể thực hiện được. Do đó, đối với tình huống này chỉ có giải pháp duy nhất là dùng Trigger trong SQL Server

Ưu điểm của Trigger trong SQL

  • Dễ dàng viết code. Vì về bản chất, chúng đã được mã hóa như stored procedure. Nhờ thế, quá trình bắt đầu làm việc với Trigger trở nên thuận lợi, dễ dàng và nhanh chóng hơn. 
  • Cho phép người dùng có thể tạo audit cơ bản thông qua việc sử dụng bảng dữ liệu đã xóa trong Trigger. Bằng cách tận dụng bảng này chèn vào bảng kiểm tra, bạn sẽ dễ dàng xây dựng giải pháp đánh giá phù hợp.
  • Hỗ trợ người dùng gọi các store procedure, hàm lưu trữ trong một Trigger.
  • Tạo Trigger trong SQL Server trở nên hữu ích khi người dùng xác thực các dữ liệu thêm vào hoặc cập nhật theo batch.
  • Được sử dụng để thực thi tính toàn vẹn tham chiếu dữ liệu.
  • Trong trường hợp các sự kiện xảy ra khi có sự điều chỉnh dữ liệu như thêm vào, cập nhật hoặc xóa thì vai trò của Trigger rất hữu ích.
  • Thông qua CLR Trigger, người dùng được phép làm Trigger bằng cách tận dụng code bên ngoài. Đây là loại Trigger chỉ định phương thức hợp ngữ viết bằng .NET liên kết với Trigger.
  • Có tới 32 cấp độ lồng vào nhau của các Trigger. Trong đó, một Trigger được xem là lồng vào nhau khi thực hiện hành động kích hoạt Trigger khác.
  • Sử dụng Trigger để thay thế các công việc hẹn giờ theo lịch.

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

  • Trigger đóng vai trò là một phần của quá trình kiểm tra tính hợp lệ dữ liệu. Nó không thay thế cho toàn bộ hoạt động này. 
  • Chỉ hoạt động ngầm trong cơ sở dữ liệu và không hiển thị ở giao diện nên khó chỉ ra các vấn đề xảy ra ở tầng cơ sở dữ liệu.
  • Hoạt động của Trigger là cập nhật lên bảng dữ liệu nên làm tăng khối lượng công việc cho cơ sở dữ liệu. Vì thế, hệ thống sẽ vận hành chậm hơn.
  • trigger trong sql

Bài tập về Trigger trong SQL

Để hiểu hơn về Trigger, bạn có thể tham khảo ví dụ sau:

Giả sử, bạn có bảng employees như hình minh họa bên dưới.

trigger trong sql

Bây giờ, bạn tạo một Trigger có chức năng lưu giữ lịch sử cập nhật của mỗi nhân viên. Để thực hiện, bạn làm theo các bước hướng dẫn sau:

Bước 1: Bạn cần tạo một bảng employee mới, đặt tên là employee_edit bằng lệnh như sau.

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

);

Bước 2: bạn viết Trigger thực hiện chức năng lưu trữ các thay đổi của employees. Câu lệnh lúc này là:

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âu lệnh trên, bạn dùng từ khóa OLD để có thể truy cập thông tin dữ liệu của hàng trong cột employeeNumber và lastname bị Trigger gây ảnh hưởng. 

Lưu ý: 

  • Trong trường hợp tạo Trigger cho thêm dữ liệu (Insert), bạn sử dụng từ khóa NEW.
  • Đối với trường hợp tạo Trigger để xóa dữ liệu, bạn sử dụng từ khóa OLD.
  • Đối với Trigger cho việc cập nhật dữ liệu thì bạn sử dụng từ khóa OLD cho hàng trước khi cập nhật, từ khóa NEW cho hàng sau khi cập nhật. 
  • Để xem toàn bộ Trigger trong cơ sở dữ liệu, bạn dùng hàm SHOW TRIGGERS;

Bước 3: Thực hiện cập nhập bảng employees với cú pháp câu lệnh sau.

UPDATE employees 

SET 

    lastName = 'Phan'

WHERE

    employeeNumber = 1056;

Nếu muốn kiểm tra TRIGGER được thực hiện chưa, bạn sử dụng câu lệnh bên dưới để truy vấn trên bảng employees_edit:

SELECT * FROM employees_edit;

Lúc này, kết quả truy vấn trả về như hình sau:

trigger trong sql

Như vậy, Trigger đã được thực hiện, đồng thời nó đã tiến hành chèn một bảng ghi mới trong bảng employees_edit.

Xóa Trigger trong SQL

Cú pháp DROP TRIGGER là câu lệnh xóa Trigger trong SQL khỏi cơ sở dữ liệu. Đối với Trigger DML, câu lệnh có dạng minh họa như sau: 

DROP TRIGGER [ IF EXISTS ] [schema_name.]trigger_name [ ,...n ];

Trong đó:

  • IF EXISTS: Là xóa Trigger đang tồn tại.
  • schema_name: Tên của lượt đồ có chứa Trigger DML.
  • trigger_name: Tên của Trigger cần xóa.

Khi muốn xóa nhiều Trigger cùng lúc, bạn sử dụng dấu “,” để phân tách Trigger. 

Đối với Trigger DDL, để xóa một hay nhiều Trigger, bạn dùng câu lệnh DROP TRIGGER sau:

DROP TRIGGER [ IF EXISTS ] trigger_name [ ,...n ]   

ON { DATABASE | ALL SERVER };

Trong đó:

  • DATABASE: Là phạm vi trigger DDL trong cơ sở dữ liệu.
  • ALL SERVER: Là phạm vi áp dụng của Trigger DDL cho máy chủ.

Đối với xóa Trigger của sự kiện LOGON, bạn dùng câu lệnh bên dưới: 

DROP TRIGGER [ IF EXISTS ] trigger_name [ ,...n ]   

ON ALL SERVER;

Lưu ý: 

Khi bạn xóa bất ký bảng nào thì toàn bộ Trigger trong SQL có liên kết với bảng sẽ tự động xóa theo. 

trigger trong sql