Trigger Trong SQL Là Gì? Ý Nghĩa Và Cách Sử Dụng Trigger

1903 lượt xem

Nếu bạn là người mới bắt đầu tìm hiểu về SQL, có thể thuật ngữ “Trigger” còn khá xa lạ. Tuy nhiên, đối với những ai đang muốn khám phá sâu hơn về ngôn ngữ truy vấn dữ liệu này, Trigger là một khái niệm quan trọng không thể bỏ qua. Hãy cùng tìm hiểu Trigger trong SQL là gì và tại sao nó lại hữu ích trong việc quản lý cơ sở dữ liệu nhé!

Trigger Là Gì ?Trigger Trong SQL

Trigger là một thủ tục lập trình SQL được kích hoạt tự động bởi server khi xảy ra các sự kiện cụ thể như:Thêm (Insert), Xóa (Delete) hoặc Cập nhật (Update) dữ liệu. Không giống như stored procedure thông thường, Trigger không yêu cầu tham số đầu vào và chủ yếu được sử dụng để đảm bảo toàn vẹn dữ liệu. Chúng được lập trình để thực thi tự động và quản lý bởi DB Server, nhằm kiểm soát và bảo vệ dữ liệu khi có thay đổi, từ đó tăng cường sự ổn định và an toàn cho dữ liệu trong hệ thống

Triggers trong SQL
Triggers trong SQL

Thông qua việc áp dụng trigger, bạn có thể phát triển logic kinh doanh phức tạp, tiến hành kiểm tra các điều kiện cụ thể và bảo vệ tính nhất quán và độ tin cậy của dữ liệu.

Các loại Trigger phổ biến:

  • BEFORE Trigger: Được kích hoạt trước khi sự kiện diễn ra, cho phép kiểm tra và chỉnh sửa dữ liệu trước khi thay đổi được thực hiện.
  • AFTER Trigger: Được kích hoạt sau khi sự kiện đã xảy ra, thường được sử dụng để cập nhật thông tin trên các bảng phụ thuộc
  • INSTEAD OF Trigger: Hoạt động thay thế cho hành động gốc của sự kiện, thường được áp dụng đối với các View.

Ví dụ thực tế:

Bạn có thể áp dụng Trigger trong SQL để tự động cập nhật dữ liệu trong bảng “Tổng số lượng sản phẩm” ngay khi có sản phẩm mới được nhập vào bảng “Sản phẩm”.

Trong môi trường làm việc với SQL Server và các nền tảng quản lý cơ sở dữ liệu khác, kỹ năng sử dụng Trigger là thiết yếu đối với các lập trình viên phần mềm. Trigger không chỉ giúp tự động hóa các hoạt động mà còn đảm bảo dữ liệu luôn được nhất quán và an toàn, từ đó tạo điều kiện cho việc tích hợp và tương tác dữ liệu hiệu quả trong các hệ thống phức tạp.

 

Các loại Trigger trong SQL
Các loại Trigger trong SQL

Trigger Dùng Để Làm Gì ?

Trigger không chỉ là một công cụ đơn thuần mà còn là một giải pháp đa năng, mang lại nhiều lợi ích thiết thực cho việc quản lý và bảo vệ dữ liệu:

  • Đảm bảo toàn vẹn dữ liệu: Kiểm tra và duy trì các ràng buộc dữ liệu phức tạp, bảo đảm sự nhất quán và chính xác của dữ liệu.
  • Tự động hóa các công việc: Tự động thực hiện các phép tính, cập nhật và đồng bộ hóa dữ liệu giữa các bảng.
  • Giám sát và ghi nhật ký: Theo dõi mọi thay đổi trong dữ liệu và lưu trữ các hoạt động này để phân tích và kiểm soát sau này.
  • Bảo vệ dữ liệu: Kiểm soát quyền truy cập và ngăn chặn các hành động không phép, từ đó tăng cường bảo mật cho dữ liệu.

Cú Pháp Của Trigger

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

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

Trong đó:

  • Một Trigger được tạo ra bằng câu lệnh CREATE TRIGGER. Để đặt tên cho Trigger, bạn nên tuân theo định dạng: [trigger time][table name][trigger event] .Ví dụ: before_employees_update.
  • Thời điểm kích hoạt có thể là BEFORE hoặc AFTER. Bạn cần xác định thời điểm này dựa trên nhu cầu xử lý dữ liệu: sử dụng BEFORE để can thiệp vào dữ liệu trước khi thay đổi được áp dụng lên bảng, và AFTER để xử lý sau khi các thay đổi đã được thực hiện.
  • Sự kiện kích hoạt Trigger có thể là INSERT, UPDATE, hoặc DELETE.
    Trigger này cần được liên kết với một bảng cụ thể, và bạn sử dụng từ khóa ON để chỉ định bảng này.
  • Mọi câu lệnh SQL liên quan đến Trigger này phải được viết giữa BEGINEND.

Các Lớp Trigger Trong SQL Server

Trong SQL Server, có hai phân loại chính của trigger:

DDL Trigger (Data Definition Language): Các trigger này được kích hoạt do các thay đổi liên quan đến cấu trúc của cơ sở dữ liệu, ví dụ như các hoạt động tạo, sửa đổi hoặc xóa bảng, cũng như các thay đổi về quyền truy cập.

DML Trigger (Data Manipulation Language): Loại trigger này phản ứng với các thay đổi dữ liệu trong cơ sở dữ liệu, bao gồm các hoạt động thêm, sửa đổi hoặc xóa các bản ghi trong bảng. DML Trigger được phân thành các nhóm nhỏ hơn như FOR/AFTER trigger và INSTEAD OF trigger.

Trigger Trong SQL Được Sử Dụng Như Thế Nào?

Trong SQL, trigger là công cụ linh hoạt được áp dụng để tự động thực hiện các lệnh hoặc thủ tục phản ứng với các sự kiện cụ thể trong cơ sở dữ liệu:

  • Quản Lý Mối Quan Hệ Giữa Các Bảng: Trigger có thể được dùng để thực hiện các kiểm tra ràng buộc phức tạp giữa các bảng, vượt ra ngoài những ràng buộc cơ bản như khóa ngoại. Điều này bao gồm việc đảm bảo dữ liệu trong một bảng tuân thủ các quy tắc dựa trên dữ liệu của bảng khác.
  • Quản Lý Mối Quan Hệ Trong Cùng Một Bảng: Đôi khi, trigger cũng được sử dụng để kiểm soát mối quan hệ giữa các dòng trong cùng một bảng, đảm bảo rằng các thay đổi dữ liệu tuân thủ các quy định nghiệp vụ đặc biệt.
  • Ngăn Chặn Việc Xóa Dữ Liệu: Trong những tình huống cần bảo vệ dữ liệu không được phép bị xóa, trigger có thể được thiết lập để chặn thao tác xóa trên các bản ghi quan trọng, từ đó giữ cho dữ liệu quan trọng không bị mất mát hay thay đổi không mong muốn.
  • Tự Động Hóa Các Hàm Chức Năng: Trigger cũng rất hữu ích trong việc tự động hóa các hành động phức tạp như cập nhật dữ liệu trên các bảng khác dựa trên thay đổi của một bảng, hoặc thực hiện các thủ tục phức tạp mà không cần sự can thiệp thủ công.

Cần phải sử dụng chúng một cách cẩn trọng để tránh gây ra các vấn đề về hiệu suất hoặc làm phức tạp hóa quá trình quản lý cơ sở dữ liệu.

Vai Trò Của Trigger Trong SQL Server Và Những Điều Bạn Cần Biết

Một đặc điểm cơ bản của các cơ sở dữ liệu quan hệ (relational databases) là tính nhất quán của dữ liệu. Điều này có nghĩa là tất cả thông tin được lưu trong database phải được duy trì nhất quán qua các session và transaction. Do đó, để bảo đảm tính nhất quán này, SQL Server cần áp dụng các ràng buộc giữa foreign key và primary key.

Bên cạnh đó, trong SQL Server, khi hai bảng thuộc hai database hoặc hai máy chủ khác nhau, việc thực thi tính toàn vẹn tham chiếu bằng foreign key trở nên không khả thi. Trong trường hợp này, việc sử dụng Trigger trong SQL Server là giải pháp duy nhất để quản lý và duy trì tính toàn vẹn giữa các bảng dữ liệu.

Ưu Và Nhược Điểm Của Trigger

Thực tế là việc coi trigger trong SQL như các stored procedure thì sẽ có ưu điểm và nhược điểm. Trigger trong SQL Server cung cấp cho chúng ta khả năng thực hiện những việc không thể thực hiện bởi stored procedure.

Ưu Điểm 

  • Việc lập trình trigger khá đơn giản vì chúng được cấu trúc giống như stored procedures. Điều này làm cho việc học cách tạo và sử dụng triggers trở nên dễ dàng hơn cho người mới bắt đầu.
  • Triggers cung cấp khả năng tự động hóa việc tạo bản ghi kiểm toán. Sử dụng các bảng đã xóa hoặc đã cập nhật trong trigger, có thể dễ dàng ghi lại thay đổi dữ liệu cho mục đích kiểm toán, như lưu trữ dữ liệu được xóa bởi câu lệnh DELETE hoặc dữ liệu đã thay đổi bởi câu lệnh UPDATE.
  • Có khả năng call các stored procedures và hàm lưu trữ từ bên trong trigger, mang lại tính linh hoạt và mở rộng khả năng của cơ sở dữ liệu.
  • Trigger trong SQL rất tiện lợi khi bạn muốn kiểm tra và xác minh dữ liệu được Insert hoặc update theo batch, không phải theo từng dòng riêng lẻ.
  • Bạn có thể dùng trigger trong SQL Server để duy trì tính toàn vẹn tham chiếu database.
  • Trigger trong SQL vô cùng quan trọng để đảm bảo rằng các sự kiện luôn được thực hiện mỗi khi dữ liệu được insert, update hoặc delete.
  • Sử dụng CLR triggers cho phép tích hợp mã .NET vào SQL Server, mở rộng khả năng tùy biến và tối ưu hóa logic xử lý dữ liệu.
  • Triggers có thể được lồng nhau lên đến 32 cấp, cho phép một chuỗi phức tạp của các sự kiện được tự động hóa và xử lý một cách hiệu quả, nơi một trigger có thể kích hoạt thêm các trigger khác.

Nhược Điểm 

  • Khi sử dụng BULK INSERT để nhập dữ liệu hàng loạt vào bảng trong SQL Server, một điểm cần lưu ý quan trọng là trigger sẽ không tự động kích hoạt trừ khi bạn bao gồm tùy chọn FIRE_TRIGGERS. Điều này có ý nghĩa đặc biệt trong trường hợp bạn dựa vào trigger để duy trì tính nhất quán dữ liệu hoặc thực hiện các nhiệm vụ kiểm toán.Điều này cực kỳ quan trọng bởi vì nếu bạn có trigger được thiết lập trên một table và bạn thực hiện nhiều lệnh Insert mà không kích hoạt tùy chọn FIRE_TRIGGERS, bạn có thể làm mất đi tính nhất quán của dữ liệu.
  • Việc xác định các trigger có thể gặp khó khăn trừ khi bạn có tài liệu thích hợp, bởi chúng không hiển thị rõ ràng đối với client
  • Khi bạn thực hiện một câu lệnh DML có trigger liên kết, bạn không chỉ thực thi câu lệnh DML mà còn cả trigger. Câu lệnh DML này không được coi là hoàn tất cho đến khi trigger hoàn thành, điều này có thể gây ra rủi ro trong môi trường sản xuất.
  • Việc sử dụng trigger trong SQL nhằm mục đích kiểm tra cũng gặp phải vấn đề: trigger tự động thực thi mỗi khi được kích hoạt, không phân biệt hoàn cảnh
  • Nếu có nhiều trigger lồng nhau, điều này không chỉ khó gỡ lỗi mà còn tốn kém thời gian và nguồn lực phát triển.
  • Khi dùng trigger trong SQL để bảo đảm tính toàn vẹn của tham chiếu, cần lưu ý rằng chúng có thể bị vô hiệu hóa bởi những người dùng có quyền AFTER trên bảng hoặc view mà trigger được thiết lập. Để ngăn chặn, cần kiểm soát chặt chẽ quyền của người dùng.
  • Để CLR trigger hoạt động, cần kích hoạt tùy chọn server “clr enabled” thông qua quy trình lưu trữ hệ thống sp_configure. Việc cho phép code CLR chạy trong phiên bản database tiềm ẩn mối đe dọa bảo mật. Người dùng độc hại có thể thêm các module CLR vào database và sau đó chiếm quyền kiểm soát server.

Ví Dụ Và Cách Tạo Trigger Trong SQL

Ví dụ về trình kích hoạt trigger khi sử dụng production.products như sau:

Ví dụ về Trigger trong SQL

Tạo Bảng Ghi

Câu lệnh CREATE TABLE được đặt tênproduction.product_auditsđể ghi lại một số thông tin khiINSERThoặcDELETExảy ra sự kiện với table = production.products

CREATE TABLE production.product_audits(
change_id INT IDENTITY PRIMARY KEY,
product_id INT NOT NULL,
product_name VARCHAR(255) NOT NULL,
brand_id INT NOT NULL,
category_id INT NOT NULL,
model_year SMALLINT NOT NULL,
list_price DEC(10,2) NOT NULL,
updated_at DATETIME NOT NULL,
operation CHAR(3) NOT NULL,
CHECK(operation = 'INS' or operation='DEL')
);

Bảng production.product_audits có tất cả các cột từ bảng production.products. Bên cạnh đó, nó có thêm một vài cột để ghi lại những thay đổi, ví dụ như updated_at, operationchange_id.

Tạo DML Trigger

Đầu tiên, để tạo trigger mới, chỉ định tên trigger và schema có trong đề bài

 CREATE TRIGGER production.trg_product_audit

Tiếp theo, chỉ đinh tên table mà trigger sẽ kích hoạt khi một sự kiện xảy ra:

 ON production.products

Sau đó, bạn liệt kê một hoặc nhiều sự kiện sẽ call trigger trong lệnh AFTER

 AFTER INSERT, DELETE

Nội dung của trigger bắt đầu với từ khóa AS

AS
BEGIN
Bên trong trigger, bạn thiết lập SET NOCOUNT để ON để ngăn chặn số lượng hàng được trả lại khi trigger bị ảnh hưởng
SET NOCOUNT ON;
Trigger sẽ chèn một cột vào table production.product_audits bất cứ khi nào một row được insert hoặc delete khỏi bảng production.products. Dữ liệu cung cấp để chèn từ các bảng INSERTEDDELETED thông qua UNION ALL.
 INSERT INTO
  production.product_audits
    (
      product_id,
      product_name,
      brand_id,
      category_id,
      model_year,
      list_price,
      updated_at,
      operation
    )
SELECT
  i.product_id,
  product_name,
  brand_id,
  category_id,
  model_year,
  i.list_price,
  GETDATE(),
  'INS'
FROM
  inserted AS i
UNION ALL
  SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    getdate(),
    'DEL'
  FROM
    deleted AS d;
Sâu đây, bạn gộp các phần lại với nhau
CREATE TRIGGER production.trg_product_audit
ON production.products
AFTER INSERT, DELETE
AS
BEGIN
  SET NOCOUNT ON;
  INSERT INTO production.product_audits(
    product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    list_price,
    updated_at,
    operation
  )
  SELECT
    i.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    i.list_price,
    GETDATE(),
    'INS'
  FROM
    inserted i
  UNION ALL
  SELECT
    d.product_id,
    product_name,
    brand_id,
    category_id,
    model_year,
    d.list_price,
    GETDATE(),
    'DEL'
  FROM
    deleted d;
END
Cuối cùng, bạn thực hiện toàn bộ câu lệnh để tạo trigger. Sau khi trigger được tạo, bạn có thể tìm thấy nó trong folder trigger như hình dưới đây:

ví dụ tạo trigger trong sql server
Kiểm Tra Tigger

Chèn câu lệnh sau vào 1 hàng mới trong bảng production.products
INSERT INTO production.products
  product_name,
  brand_id,
  category_id,
  model_year,
  list_price
)
VALUES (
  'Test product',
  1,
  1,
  2018,
  599
);
Xem xét nội dung của bảng production.product_audits
 SELECT
  *
FROM
  production.product_audits;

Và đây là kết quả :

kết quả tạo trigger trong sql

Câu lệnh xóa một hàng trong bảng production.products

 DELETE FROM
  production.products
WHERE
  product_id = 322

;Và trigger đã được kích hoạt và chèn vào hàng đã xóa trong bảngproduction.product_audits:

 SELECT
*
FROM
production.product_audits;

Kết quả được xuất ra

kết quả xuất ra sau khi tạo trigger

Bằng cách này, Trigger trong SQL đã được tạo và thực thi trong cơ sở dữ liệu.

Các Câu Hỏi Thường Gặp

Làm thế nào để vô hiệu hóa hoặc xóa trigger?

Vô hiệu hóa:

 ALTER TABLE [tên bảng] DISABLE TRIGGER [tên trigger];

Xóa:

DROP TRIGGER [tên trigger];

Trigger có thể gọi các thủ tục được lưu trữ (stored procedure) không?

Có.Bạn có thể call các store procedure và hàm được lưu trữ bên trong trigger. Trigger trong SQL hữu ích khi bạn cần xác thực dữ liệu được Insert hoặc update theo batch thay vì từng hàng. Bạn có thể sử dụng trigger trong SQL Server để vận hành tính toàn vẹn tham chiếu trên database.

Trigger có thể truy cập vào dữ liệu cũ và mới không?

Có, trigger có thể truy cập vào dữ liệu cũ (trước khi thay đổi) và dữ liệu mới (sau khi thay đổi) thông qua các từ khóa đặc biệt như OLDNEW.

Trigger trong marketing là gì?

Trigger trong marketing, hay còn được biết đến là sự kiện kích hoạt, là một công cụ đắc lực giúp doanh nghiệp thúc đẩy hành vi mua sắm của khách hàng. Bằng cách nắm bắt những khoảnh khắc quan trọng trong hành trình của khách hàng, doanh nghiệp có thể xây dựng những chiến dịch marketing cá nhân hóa và nhắm đúng đối tượng mục tiêu, từ đó đạt hiệu quả cao hơn.

Kết Luận

Mong rằng những chia sẻ trên đã giúp bạn có cái nhìn tổng quan hơn về trigger trong SQL và cách tạo trigger. Việc sử dụng trigger không phải là bắt buộc, tuy nhiên nó mang lại nhiều lợi ích trong việc tự động hóa và đảm bảo tính toàn vẹn dữ liệu. Nếu bạn có bất kỳ thắc mắc nào hoặc cần hỗ trợ thêm, đừng ngần ngại để lại bình luận bên dưới. Chúc bạn thành công!