Trigger được biết tới là thuật ngữ được sử dụng trong SQL. Đối với những người mới bắt đầu thuật ngữ này có thể khá mới lạ. 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 trong bài viết dưới đây nhé. Cùng tìm hiểu thôi nào.
Trigger là gì? Trigger trong SQL
Trigger trong SQL là một khối mã lệnh thủ tục (procedure) mạnh mẽ, được kích hoạt tự động khi có một sự kiện cụ thể xảy ra trên cơ sở dữ liệu của bạn. Những sự kiện này có thể bao gồm việc thêm (INSERT), sửa (UPDATE) hoặc xóa (DELETE) dữ liệu, hay thậm chí thay đổi cấu trúc của bảng.
![Trigger trong SQL là gì ? Cách tạo và ví dụ về Trigger SQL Server 7 Trigger trong SQL là một khối mã lệnh trên cơ sở dữ liệu SQL](https://vietnix.vn/wp-content/uploads/2024/05/trigger-trong-sql.png)
Bằng cách sử dụng trigger, bạn có thể xây dựng logic nghiệp vụ phức tạp, thực hiện kiểm tra điều kiện, và đảm bảo rằng dữ liệu của bạn luôn nhất quán và đáng tin cậy.
Các loại Trigger phổ biến:
- BEFORE Trigger: Thực thi trước khi sự kiện xảy ra, cho phép bạn kiểm tra và sửa đổi dữ liệu.
- AFTER Trigger: Thực thi sau khi sự kiện xảy ra, thường dùng để cập nhật các bảng liên quan.
- INSTEAD OF Trigger: Thay thế hoàn toàn hành động của sự kiện, thường dùng trên các View.
Ví dụ thực tế:
Bạn có thể sử dụng Trigger để tự động cập nhật bảng “Tổng số lượng sản phẩm” mỗi khi có sản phẩm mới được thêm vào bảng “Sản phẩm”.
Khi làm việc với SQL Server và các hệ thống cơ sở dữ liệu khác, mình chắc chắn rằng sử dụng trigger là một kỹ năng thiết yếu cho những bạn theo đuổi phát triển phần mềm. Trigger không chỉ giúp bạn tự động hóa các tác vụ mà còn đảm bảo tính nhất quán và an toàn cho dữ liệu của bạ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 Trigger (Data Definition Language): Được kích hoạt khi có sự thay đổi về cấu trúc của cơ sở dữ liệu, chẳng hạn như tạo, sửa đổi hoặc xóa bảng, hoặc thay đổi quyền truy cập.
- DML Trigger (Data Manipulation Language): Được kích hoạt khi có sự thay đổi về dữ liệu, chẳng hạn như thêm, sửa đổi hoặc xóa bản ghi trong một bảng. DML trigger lại được chia thành các loại nhỏ hơn như FOR/AFTER trigger và INSTEAD OF trigger.
Trigger dùng để làm gì?
Ứng dụng đa dạng của Trigger:
- Đảm bảo tính toàn vẹn dữ liệu: Kiểm tra các ràng buộc phức tạp, đảm bảo dữ liệu luôn nhất quán và chính xác.
- Tự động hóa tác vụ: Thực hiện các tính toán, cập nhật dữ liệu liên quan, đồng bộ dữ liệu giữa các bảng một cách tự động.
- Giám sát và ghi log: Theo dõi các thay đổi dữ liệu, ghi lại lịch sử hoạt động để phục vụ cho việc phân tích và kiểm tra.
- Bảo mật dữ liệu: Kiểm soát truy cập, ngăn chặn các thao tác trái phép, đảm bảo an toàn cho dữ liệu.
Ư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ệnhUPDATE
. - 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ọnFIRE_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ọnFIRE_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à 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:
![Trigger trong SQL là gì ? Cách tạo và ví dụ về Trigger SQL Server 8 Ví dụ về Trigger trong SQL](https://vietnix.vn/wp-content/uploads/2021/06/trigger-trong-sql-server.webp)
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
, operation
và change_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 INSERTED
và DELETED
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:
![Trigger trong SQL là gì ? Cách tạo và ví dụ về Trigger SQL Server 9 ví dụ tạo trigger trong sql server](https://vietnix.vn/wp-content/uploads/2021/06/hvi-du-tao-trigger-trong-sql-server.webp)
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ả:
![Trigger trong SQL là gì ? Cách tạo và ví dụ về Trigger SQL Server 10 kết quả tạo trigger trong sql](https://vietnix.vn/wp-content/uploads/2021/06/ket-qua-sau-khi-trigger-trong-sql.webp)
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:
![Trigger trong SQL là gì ? Cách tạo và ví dụ về Trigger SQL Server 11 kết quả xuất ra sau khi tạo trigger](https://vietnix.vn/wp-content/uploads/2021/06/xuat-ra-khi-tao-trigger-trong-sql.webp)
Bằng cách này, Trigger trong SQL đã được tạo và thực thi trong cơ sở dữ liệu.
Câu hỏi thường gặp
Với sự phát triển của NoSQL hay NewSQL, liệu trigger có còn một giải pháp tối ưu cho việc đảm bảo tính toàn vẹn dữ liệu?
Với trải nghiệm của bản thân trong nhiều năm làm việc trong lĩnh vực cơ sở dữ liệu, mình nhận thấy rằng câu hỏi này rất phổ biến trong cộng đồng các nhà phát triển. Sự trỗi dậy của NoSQL và NewSQL đã thay đổi cách chúng ta tiếp cận việc thiết kế và quản lý dữ liệu.
Tuy nhiên, trigger vẫn giữ một vai trò quan trọng trong nhiều trường hợp, đặc biệt là khi cần đảm bảo các quy tắc nghiệp vụ phức tạp và tính nhất quán dữ liệu cao.
Khi nào nên sử dụng trigger và khi nào thì không nên sử dụng?
Bạn nên cân nhắc sử dụng trigger khi:
– Cần thực hiện các hành động lặp đi lặp lại một cách đều đặn.
– Muốn tạo ra các chiến dịch marketing cá nhân hóa và nhắm mục tiêu.
– Cần cải thiện hiệu suất của hệ thống hoặc ứng dụng.
Bạn nên tránh sử dụng trigger khi:
– Quy trình quá đơn giản và không cần tự động hóa.
– Không có đủ dữ liệu để cá nhân hóa trải nghiệm người dùng.
– Không có khả năng xử lý các lỗi hoặc sự cố có thể xảy ra.
Trigger trong marketing là gì?
Trigger trong marketing, hay còn gọi là sự kiện kích hoạt, là một chiến lược quan trọng giúp các doanh nghiệp thúc đẩy hành vi mua hàng của khách hàng. Bằng cách tận dụng những thời điểm quan trọng trong hành trình khách hàng (customer journey), doanh nghiệp có thể tạo ra những chiến dịch marketing cá nhân hóa và nhắm mục tiêu hiệu quả.
Lời kết
Hy vọng bài viết trên sẽ giúp bạn hiểu rõ hơn về trigger trong SQL và cách tạo trigger trong SQL như thế nào. 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. Nếu có bất kỳ câu hỏi hoặc vấn đề cần giải đáp, đừng ngại để lại comment phía dưới nhé. Chúc các bạn thành công.