Tự Động Hóa Dữ Liệu & Ràng Buộc Hệ Thống Với Trigger

6cc1862f-c458-48c5-a2ec-66c91e59e88b

Chào mừng bạn tiếp tục chặng đường chuỗi series SQL Nâng Cao cùng MCNA Technology School!

Làm thế nào để hệ thống tự động ghi chép nhật ký (Audit Log) mỗi khi ai đó chỉnh sửa thông tin nhân sự? Hay làm sao để tự động chặn hành vi xóa dữ liệu quan trọng ngay khi câu lệnh được phát ra? Câu trả lời nằm ở Trigger trong SQL – “người gác cổng” tự động bảo vệ và duy trì tính toàn vẹn của cơ sở dữ liệu.

1. Trigger Trong SQL Là Gì?

Trigger (Bẫy dữ liệu) là một dạng Stored Procedure đặc biệt, tự động kích hoạt (fire) khi xảy ra một sự kiện DML (INSERT, UPDATE, hoặc DELETE) trên một bảng dữ liệu nhất định.

Ưu điểm cốt lõi của Trigger:

  • Ghi nhật ký hệ thống (Audit Trail): Tự động lưu lịch sử ai đã thêm, sửa, xóa dữ liệu vào bảng nhật ký.

  • Bảo vệ dữ liệu nghiêm ngặt: Chặn các thao tác vi phạm quy tắc kinh doanh mà các Constraint thông thường không kiểm soát được.

  • Tự động hóa đa bảng: Khi bảng A thay đổi, Trigger có thể tự động cập nhật số liệu liên quan ở bảng B.

2. Hai Bảng Tạm Đặc Biệt: INSERTED Và DELETED

Khi một Trigger kích hoạt, SQL Server sẽ tự động tạo ra 2 bảng tạm thời trong bộ nhớ RAM để lưu vết dữ liệu:

  • Bảng INSERTED: Chứa các dòng dữ liệu mới được thêm vào (khi chạy lệnh INSERT) hoặc dữ liệu sau khi đã chỉnh sửa (khi chạy lệnh UPDATE).

  • Bảng DELETED: Chứa các dòng dữ liệu vừa bị xóa đi (khi chạy lệnh DELETE) hoặc dữ liệu cũ trước khi sửa (khi chạy lệnh UPDATE).

3. Phân Biệt AFTER Trigger Và INSTEAD OF Trigger

3.1. AFTER Trigger (Hoạt động sau khi thao tác hoàn tất)

Chỉ thực thi sau khi câu lệnh INSERT, UPDATE, DELETE đã đi qua các bước kiểm tra ràng buộc và ghi tạm vào bảng.

SQL

CREATE TRIGGER trg_LuuLichSuCapNhat
ON HocVien
AFTER UPDATE
AS
BEGIN
    INSERT INTO LichSuCapNhat (MaHV, TenCu, TenMoi, NgaySua)
    SELECT d.MaHV, d.HoTen, i.HoTen, GETDATE()
    FROM DELETED d
    JOIN INSERTED i ON d.MaHV = i.MaHV;
END;

3.2. INSTEAD OF Trigger (Ghi đè và thay thế thao tác)

Thực thi thay cho câu lệnh gốc. Câu lệnh INSERT, UPDATE hay DELETE ban đầu sẽ bị bỏ qua hoàn toàn, hệ thống sẽ chỉ chạy logic bên trong Trigger.

SQL

-- Chặn hành vi xóa học viên khỏi hệ thống MCNA
CREATE TRIGGER trg_ChongXoaHocVien
ON HocVien
INSTEAD OF DELETE
AS
BEGIN
    PRINT N'CẢNH BÁO: Bạn không được phép xóa dữ liệu học viên!';
END;

⚡ BẢO VỆ DATABASE DOANH NGHIỆP KHỎI CÁC SỰ CỐ DỮ LIỆU TỰ ĐỘNG

Lạm dụng Trigger hoặc viết sai logic trong INSERTED/DELETED có thể làm chậm toàn bộ tiến trình ghi dữ liệu, gây nghẽn hệ thống (Deadlock) ở scale lớn.

🚀 Nâng cấp tư vấn & triển khai cùng Khóa học SQL Nâng Cao tại MCNA Technology School:

  • Chuẩn hóa kiến trúc: Thiết kế Trigger tối ưu, quản lý Audit Log cho hệ thống hàng triệu người dùng.

  • Thực hành Lab: Triển khai cơ chế phân quyền, mã hóa và bảo vệ Database chuẩn doanh nghiệp.

  • Chuyên gia đồng hành: Hướng dẫn trực tiếp 1:1 bởi các Senior .

👉 [ĐĂNG KÝ NHẬN TƯ VẤN ] (link đăng ký)

4. Bài Tập Thực Hành SQL Nâng Cao

Hãy áp dụng kiến thức về Trigger trong SQL để giải bài toán tự động cập nhật kho hàng tại MCNA:

Đề bài: Cho bảng KhoaHoc (MaKH, TenKH, SoLuongLop) và bảng LopHoc (MaLop, MaKH, TenLop).

Hãy viết một AFTER Trigger tên là trg_TangSoLuongLop trên bảng LopHoc:

  • Mỗi khi một lớp học mới được thêm vào bảng LopHoc (INSERT), Trigger sẽ tự động tăng cột SoLuongLop ở bảng KhoaHoc tương ứng lên 1 đơn vị.

SQL

CREATE TRIGGER trg_TangSoLuongLop
ON LopHoc
AFTER INSERT
AS
BEGIN
    UPDATE KhoaHoc
    SET SoLuongLop = SoLuongLop + 1
    FROM KhoaHoc kh
    JOIN INSERTED i ON kh.MaKH = i.MaKH;
    
    PRINT N'Đã tự động cập nhật tăng số lượng lớp học!';
END;

Tác giả: Huỳnh Trung Hậu

📞 Hotline: 0939.866.825 (Mr. Minh Khang)
🌐 Website: MCNA Technology School
📍 Hà Nội: 30 Trung Liệt, Đống Đa | Liền kề 44B TT2 Văn Quán, Hà Đông
📍 TP.HCM: 50B Phan Tây Hồ, Cầu Kiệu

Chỉ mục