Hotline : 1800 1093 - 07 088 44444
Thích
Chia sẻ

Trigger SQL là gì? Cách tạo và ví dụ về Trigger trong SQL Server

24/06/2021

Trigger SQL là gì?

Trigger trong SQL server là một đoạn procedure code, chỉ được vận hành khi có một sự kiện xảy ra. Có nhiều loại sự kiện khác nhau để kích hoạt trigger trong SQL. Có thể kể đến như việc chèn các hàng trong bảng, thay đổi cấu trúc bảng hoặc thậm chí người dùng đăng nhập vào một phiên bản SQL Server.

trigger trong sql
Trigger trong SQL

Có ba đặc điểm chính làm cho trigger trong SQL khác với các stored procedures:

  • Người dùng không thể thực hiện thủ công các trigger.
  • Không có cơ hội cho trigger nhận thông số.
  • Bạn sẽ không thể cam kết hoặc khôi phục một transaction bên trong trigger.

Việc không thể sử dụng các tham số trên trigger trong SQL không phải là hạn chế để nhận thông tin từ sự kiện. Nhưng bạn sẽ có các lựa chọn thay thế để lấy thông tin từ các sự kiện.

Cú pháp của Trigger

Trong đoạn code sau đây, bạn sẽ thấy cú pháp CREATE TRIGGER để tạo trigger trong SQL cơ bản:

CREATE TRIGGER tên_trigger  
ON { Tên_bảng }   
[ WITH <Options> ]  
{ FOR | AFTER | INSTEAD OF }   
{ [INSERT], [UPDATE] , [DELETE] }

Các lớp Trigger trong SQL Server

Có hai lớp trigger trong SQL Server:

  • DDL (Data Definition Language) trigger: Loại trigger này kích hoạt khi các sự kiện thay đổi cấu trúc (như tạo, sửa đổi hay loại bỏ bảng). Hoặc trong các sự kiện liên quan đến server như thay đổi bảo mật hoặc sự kiện cập nhật thống kê.
  • DML (Data Modification Language) trigger: Đây là loại trigger được sử dụng nhiều nhất. Trong trường hợp này, sự kiện kích hoạt là một câu lệnh sửa đổi dữ liệu. Nó có thể là một câu lệnh chèn, cập nhật hoặc xoá trên một bảng.

Ngoài ra, DML trigger còn có các loại khác nhau:

  • FOR hoặc AFTER [[INSERT, UPDATE, DELETE]: Các loại trigger này được thực thi sau khi câu lệnh kích hoạt kết thúc.
  • INSTEAD OF [INSERT, UPDATE, DELETE]: Trái ngược với FOR (AFTER), trigger INSTEAD OF thực thi thay vì thay cho câu lệnh kích hoạt. Nói cách khác, loại trigger này thay thế câu lệnh kích hoạt. Điều này rất hữu ích trong trường hợp bạn cần có tính toàn vẹn tham chiếu database chéo.

Tầm quan trọng của Trigger trong SQL Server

Một trong những đặc điểm cơ bản của relational databases là tính nhất quán dữ liệu. Điều này có nghĩa là thông tin được lưu trữ trong database luôn nhất quán cho mọi session và mọi transaction. Cách các công cụ relational database như SQL server thực hiện điều này bằng cách thực thi ràng buộc các primary key và foreign key.

Trong SQL Server không có cơ hội thực thi tính toàn vẹn tham chiếu giữa hai bảng bằng foreign key nếu các bảng đó nằm trong database khác nhau hoặc server khác nhau. Trong trường hợp này, cách duy nhất để thực hiện là sử dụng trigger trong SQL Server.

Ưu điểm 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 của Trigger

  • Trigger trong SQL rất dễ để viết code. Thực tế là chúng được mã hóa giống như các stored procedure. Điều này giúp việc bắt đầu với các trigger trở nên dễ dàng hơn rất nhiều.
  • Trigger cho phép bạn tạo audit cơ bản. Bằng cách sử dụng bảng đã xóa bên trong một trigger. Bạn có thể xây dựng một giải pháp kiểm tra phù hợp để chèn nội dung của dữ liệu bảng đã xóa vào một bảng kiểm tra lưu giữ dữ liệu đang bị xóa bởi câu lệnh DELETE hoặc được thay đổi bởi câu lệnh UPDATE.
  • 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 trong SQL rất hữu ích nếu bạn cần đảm bảo rằng các sự kiện luôn xảy ra khi dữ liệu được insert, update hoặc delete.
  • Bạn có thể sử dụng code bên ngoài làm trigger bằng cách sử dụng CLR trigger. Loại trigger này chỉ định phương thức của một hợp ngữ được viết bằng .NET để liên kết với trigger.
  • Các trigger có thể được lồng vào nhau đến 32 cấp độ. Một trigger được coi là lồng vào nhau khi nó thực hiện một hoạt động kích hoạt một trigger khác.

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

  • Khi bạn sử dụng BULK INSERT để chèn dữ liệu vào table, trigger sẽ không được kích hoạt trừ khi ban bao gồm tùy chọn FIRE_TRIGGERS trong hàng loạt câu lệnh Insert của mình. Điều này rất quan trọng, vì nếu bạn có trigger trên một table và bạn thực hiện hàng loạt thao tác Insert mà không bao gồm tùy chọn FIRE_TRIGGERS, bạn sẽ mất đi tính nhất quán của dữ liệu.
  • Rất khó xác định các trigger trừ khi bạn có tài liệu thích hợp. Vì chúng không thể nhìn thấy đối với client.
  • Mỗi khi bạn chạy một câu lệnh DML có một trigger được liên kết với nó, bạn thực sự đang thực thi câu lệnh DML và trigger. Nhưng theo định nghĩa, câu lệnh DML sẽ không kết thúc cho đến khi quá trình thực thi trigger hoàn tất. Điều này có thể tạo ra một thảm họa trong sản xuất.
  • Vấn đề của việc sử dụng trigger trong SQL cho mục đích kiểm tra là khi trigger được bật. Chúng luôn thực thi bất kể trường hợp nào khiến trigger kích hoạt.
  • Nếu có nhiều trigger lồng nhau, có thể rất khó gỡ lỗi và khắc phục sự cố. Điều này làm tiêu tốn thời gian và tài nguyên để phát triển.
  • Nếu bạn sử dụng trigger trong SQL để thực thích tính toàn vẹn của tham chiếu, bạn phải lưu ý rằng trigger trong SQL có thể bị vô hiệu hóa bởi người dùng có quyền AFTER trên bảng hoặc chế độ xem nơi trigger được tạo ra. Để tránh điều này, bạn có thể phải xem xét các quyền của người dùng.
  • Để CLR trigger hoạt động, bạn phải kích hoạt tùy chọn server “clr enabled” bằng cách sử dụng 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. Vì người dùng độc hại có thể thêm các cụm CLR vào database và sau đó chiếm quyền kiểm soát server.

Ví dụ về Trigger trong SQL

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

Tạo bảng ghi

Câu lệnh CREATE TABLE được đặt tên production.product_audits để ghi lại một số thông tin khi INSERT hoặc DELETE xả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
Tìm trigger sau khi tạo trong thư mục

Kiểm tra trigger

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
Kết quả sau khi kiêm tra

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ảng production.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.

Lời kết

Bài viết này giúp bạn hiểu rõ hơn về trigger trong SQL và cách tạo trigger. Việc sử dụng trigger không bắt buộc và nó vẫn được sử dụng với nhiều mục đích riêng. Chúc các bạn thành công.

Nếu bạn có thắc mắc hay có vấn đề cần hỗ trợ, bạn có thể liên hệ trực tiếp với Vietnix thông qua các kênh sau:
  • Hotline: 1800 1093 - 07 088 44444
  • Email: support@vietnix.vn
  • Hoặc chat trực tiếp với Vietnix thông qua biểu tượng Livechat ở góc phải màn hình. Đội ngũ chuyên viên của chúng tôi luôn sẵn sàng tư vấn và hỗ trợ bạn 24/7.
Vietnix hiện đang có chương trình khuyến mãi lớn nhất trong năm, giảm giá 50%  dịch vụ Hosting. Đăng ký dùng thử ngay và Vietnix sẽ hoàn tiền 100% nếu quý khách không hài lòng với chất lượng sản phẩm, dịch vụ!
Mình là Bo - admin của Quản Trị Linux. Mình đã có 10 năm làm việc trong mảng System, Network, Security và đã trải nghiệm qua các chứng chỉ như CCNP, CISSP, CISA, đặc biệt là chống tấn công DDoS. Gần đây mình trải nghiệm thêm Digital Marketing và đã hòan thành chứng chỉ CDMP của PersonVUE. Mình rất thích được chia sẻ và hỗ trợ cho mọi người, nhất là các bạn sinh viên. Hãy kết nối với mình nhé!
Bài viết liên quan
Không có bài viết liên quan
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments