Bài 1: Giới thiệu về Trình quản lý quảng cáo
🚀 BÀI GIẢNG: TRIGGERS & VIEWS TRONG MSSQL
1️⃣ TRIGGERS
🔍 Khái niệm
-
Trigger là thủ tục đặc biệt tự động được thực thi (triggered) khi có INSERT, UPDATE, DELETE xảy ra trên một bảng hoặc view.
-
Dùng để:
-
Tự động kiểm tra, ràng buộc logic nghiệp vụ.
-
Tự động ghi log lịch sử.
-
Đồng bộ dữ liệu giữa các bảng.
-
🔥 Cú pháp cơ bản
CREATE TRIGGER <TenTrigger>
ON <TenBang>
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
-- Thực hiện hành động
END
-
AFTERchạy sau khi thay đổi thành công. -
Có thể dùng
INSTEAD OFđể thay thế hành động mặc định.
🏗 Ví dụ 1: Tạo Trigger ghi log khi có đăng ký khóa học mới
Giả sử bạn có bảng DangKyKhoaHoc, muốn mỗi khi có INSERT thì ghi log ra console.
CREATE TRIGGER trg_LogInsertDangKy
ON DangKyKhoaHoc
AFTER INSERT
AS
BEGIN
PRINT 'Có đăng ký khóa học mới được thêm.'
END
🏗 Ví dụ 2: Trigger kiểm tra học phí không được âm
Muốn mỗi khi INSERT/UPDATE vào DangKyKhoaHoc mà HocPhi < 0 thì không cho phép.
CREATE TRIGGER trg_CheckHocPhi
ON DangKyKhoaHoc
AFTER INSERT, UPDATE
AS
BEGIN
IF EXISTS (SELECT * FROM inserted WHERE HocPhi < 0)
BEGIN
RAISERROR ('HocPhi không được âm!', 16, 1)
ROLLBACK TRANSACTION
END
END
🏗 Ví dụ 3: Trigger tự động set Active=1 cho TaiKhoanHocVien khi đăng ký
Nếu học viên đăng ký khóa học lần đầu tiên, thì cập nhật Active = 1.
CREATE TRIGGER trg_ActivateHocVien
ON DangKyKhoaHoc
AFTER INSERT
AS
BEGIN
UPDATE TaiKhoanHocVien
SET Active = 1
FROM TaiKhoanHocVien t
INNER JOIN inserted i ON t.ID = i.idHocVien
END
2️⃣ VIEWS
🔍 Khái niệm
-
View là một bảng ảo, kết quả của một câu
SELECTđược lưu lại dưới dạng đối tượng trong database. -
Dùng để:
-
Đơn giản hóa truy vấn dữ liệu phức tạp.
-
Giấu cấu trúc thực của bảng.
-
Tăng khả năng bảo mật.
-
🔥 Cú pháp cơ bản
CREATE VIEW <TenView>
AS
SELECT ...
🏗 Ví dụ 1: Tạo View lấy danh sách khóa học kèm tên chủ đề
CREATE VIEW vw_KhoaHocChuDe
AS
SELECT kh.ID AS IDKhoaHoc, kh.TenKhoaHoc, cd.TenChuDe
FROM KhoaHoc kh
LEFT JOIN ChuDe cd ON kh.idChuDe = cd.ID
👉 Dùng View:
SELECT * FROM vw_KhoaHocChuDe
🏗 Ví dụ 2: Tạo View liệt kê đăng ký khóa học, kèm tên học viên & tên khóa học
CREATE VIEW vw_DangKyChiTiet
AS
SELECT dk.ID, hv.HoVaTen AS TenHocVien, kh.TenKhoaHoc, dk.ThoiGianDangKy, dk.HocPhi
FROM DangKyKhoaHoc dk
INNER JOIN TaiKhoanHocVien hv ON dk.idHocVien = hv.ID
INNER JOIN KhoaHoc kh ON dk.idKhoaHoc = kh.ID
👉 Dùng View:
SELECT * FROM vw_DangKyChiTiet WHERE HocPhi > 200000
🏗 Ví dụ 3: View danh sách video với tên khóa học
CREATE VIEW vw_VideoChiTiet
AS
SELECT v.ID AS IDVideo, v.TieuDe, v.LuotXem, kh.TenKhoaHoc
FROM Video v
INNER JOIN KhoaHoc kh ON v.idKhoaHoc = kh.ID
👉 Dùng View:
SELECT * FROM vw_VideoChiTiet WHERE LuotXem > 100
3️⃣ So sánh nhanh
| Đặc điểm | Triggers | Views |
|---|---|---|
| Thời điểm chạy | Tự động khi DML xảy ra | Chỉ chạy khi SELECT gọi view |
| Trả dữ liệu | ❌ Không (nhưng có thể INSERT vào bảng khác) | ✅ Có |
| Dùng để | Đảm bảo logic, audit | Truy vấn dữ liệu phức tạp |
✅ Kết luận
-
Dùng Triggers khi cần ràng buộc logic tự động, ví dụ:
-
Không cho nhập học phí âm.
-
Tự động cập nhật trạng thái.
-
-
Dùng Views khi cần truy vấn tổng hợp, phức tạp, thay vì viết lại JOIN nhiều lần.
🚀 3 bài tập về TRIGGERS
📌 Bài 1
Tạo một AFTER INSERT TRIGGER trên bảng TaiKhoanHocVien để:
-
Tự động đặt giá trị
Active= 1 nếuNgayDangKylà ngày hiện tại.
📌 Bài 2
Tạo một AFTER UPDATE TRIGGER trên bảng KhoaHoc để:
-
Nếu cột
idChuDeđược thay đổi, ghi ra thông báo bằngPRINTnội dung:
'Chủ đề của khóa học đã thay đổi.'
📌 Bài 3
Tạo một AFTER DELETE TRIGGER trên bảng KhoaHoc để:
-
Khi một khóa học bị xóa, tự động xóa luôn tất cả
Videothuộc khóa học đó (nếu chưa cóON DELETE CASCADE), bằngDELETE FROM Video WHERE idKhoaHoc = deleted.ID.
🚀 3 bài tập về VIEWS
📌 Bài 4
Tạo một VIEW hiển thị danh sách tất cả học viên, kèm số lượng khóa học đã đăng ký (COUNT) của mỗi học viên.
📌 Bài 5
Tạo một VIEW hiển thị danh sách tất cả video, kèm theo tên khóa học và tên chủ đề của video đó.
📌 Bài 6
Tạo một VIEW liệt kê tất cả nhân viên quản lý (TaiKhoanQuanLy) cùng tổng học phí mà họ đã xác nhận (tính theo DangKyKhoaHoc), hiển thị HoVaTen, Email, và tổng tiền đã xác nhận.