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é!
Mục lục[ẩn]
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
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:
Để tạo một Trigger, bạn sử dụng câu lệnhCREATE TRIGGER
:
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:
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.
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.
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.
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.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.Ví dụ về trình kích hoạt trigger khi sử dụng production.products
như sau:
Câu lệnh CREATE TABLE
được đặt tênproduction.product_audits
để ghi lại một số thông tin khiINSERT
hoặcDELETE
xảy ra sự kiện với table = production.products
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_audit
s 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
.
Đầ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
SET NOCOUNT
để ON
để ngăn chặn số lượng hàng được trả lại khi trigger bị ảnh hưởngproduction.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;
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
production.products
product_name, brand_id, category_id, model_year, list_price ) VALUES ( 'Test product', 1, 1, 2018, 599 );
production.product_audits
SELECT * FROM production.product_audits;
Và đây là kết quả :
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
Bằng cách này, Trigger trong SQL đã được tạo và thực thi trong cơ sở dữ liệu.
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ư OLD và NEW.
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.
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!