Bài Tập Phần Trigger Có Lời Giải

Phân loại trigger trong SQL Server

Bài tập về trigger là phần không thể thiếu trong quá trình học tập và thực hành SQL Server. Việc luyện tập với các bài tập có lời giải chi tiết sẽ giúp bạn hiểu rõ hơn về cách thức hoạt động, ứng dụng thực tế cũng như nâng cao kỹ năng viết trigger của mình.

Trigger Trong SQL Server Là Gì?

Trước khi đi vào các bài tập cụ thể, chúng ta cùng điểm qua khái niệm về trigger trong SQL Server. Trigger là một loại thủ tục lưu trữ đặc biệt, được kích hoạt tự động khi có sự thay đổi dữ liệu trên bảng (table) thông qua các thao tác INSERT, UPDATE, DELETE. Trigger thường được sử dụng để:

  • Kiểm tra tính toàn vẹn dữ liệu (data integrity)
  • Duy trì log các hoạt động trên bảng
  • Đồng bộ hóa dữ liệu giữa các bảng
  • Thực hiện các tác vụ phức tạp trước hoặc sau khi thay đổi dữ liệu

Các Loại Trigger Trong SQL Server

SQL Server hỗ trợ ba loại trigger chính:

  • DDL Trigger: Được kích hoạt khi có sự kiện liên quan đến định nghĩa dữ liệu (Data Definition Language), ví dụ như tạo bảng, sửa đổi bảng, xóa bảng.
  • DML Trigger: Được kích hoạt khi có sự kiện liên quan đến thao tác dữ liệu (Data Manipulation Language) như INSERT, UPDATE, DELETE trên bảng.
  • Logon Trigger: Được kích hoạt khi có người dùng đăng nhập vào SQL Server.

Phân loại trigger trong SQL ServerPhân loại trigger trong SQL Server

Bài viết này sẽ tập trung vào DML Trigger, loại trigger phổ biến và thường gặp nhất.

Cấu Trúc Của Một Trigger

CREATE TRIGGER [tên_trigger]
ON [tên_bảng]
[FOR | AFTER | INSTEAD OF] {[INSERT], [UPDATE], [DELETE]}
AS
BEGIN
    -- Các câu lệnh SQL được thực thi khi trigger được kích hoạt
END;

Trong đó:

  • CREATE TRIGGER: Câu lệnh khai báo tạo trigger.
  • [tên_trigger]: Tên trigger do bạn tự định nghĩa.
  • [tên_bảng]: Tên bảng mà trigger sẽ được gắn vào.
  • FOR | AFTER | INSTEAD OF: Xác định thời điểm trigger được kích hoạt:
    • FOR: Tương đương AFTER.
    • AFTER: Trigger được kích hoạt sau khi thao tác INSERT, UPDATE, DELETE thành công.
    • INSTEAD OF: Trigger được kích hoạt thay thế cho thao tác INSERT, UPDATE, DELETE.
  • {[INSERT], [UPDATE], [DELETE]}: Xác định thao tác nào sẽ kích hoạt trigger. Có thể sử dụng một hoặc nhiều thao tác cùng lúc.
  • BEGIN…END: Khối lệnh chứa các câu lệnh SQL sẽ được thực thi khi trigger được kích hoạt.

Bài Tập Trigger Có Lời Giải

Dưới đây là một số bài tập trigger có lời giải chi tiết, giúp bạn luyện tập và củng cố kiến thức:

Bài tập 1: Tạo trigger tự động cập nhật ngày giờ sửa đổi (LastModifiedDate) khi có bản ghi trên bảng Products bị sửa đổi.

CREATE TRIGGER trg_Products_UpdateLastModifiedDate
ON Products
AFTER UPDATE
AS
BEGIN
    UPDATE Products
    SET LastModifiedDate = GETDATE()
    WHERE ProductID IN (SELECT DISTINCT ProductID FROM inserted);
END;

Giải thích:

  • trg_Products_UpdateLastModifiedDate: Tên trigger.
  • Products: Tên bảng cần tạo trigger.
  • AFTER UPDATE: Trigger được kích hoạt sau khi có bản ghi trên bảng Products bị sửa đổi.
  • inserted: Bảng ảo lưu trữ dữ liệu của các bản ghi mới được thêm vào hoặc sửa đổi.
  • UPDATE Products SET LastModifiedDate = GETDATE(): Câu lệnh cập nhật trường LastModifiedDate bằng ngày giờ hiện tại.
  • WHERE ProductID IN (SELECT DISTINCT ProductID FROM inserted): Chỉ cập nhật những bản ghi có ProductID tồn tại trong bảng inserted (những bản ghi vừa được sửa đổi).

Ví dụ về trigger cập nhật ngày giờVí dụ về trigger cập nhật ngày giờ

Bài tập 2: Tạo trigger ngăn chặn việc xóa bản ghi trên bảng Orders nếu trạng thái đơn hàng (OrderStatus) là ‘Đã xác nhận’.

CREATE TRIGGER trg_Orders_PreventDeleteConfirmedOrders
ON Orders
INSTEAD OF DELETE
AS
BEGIN
    IF EXISTS (SELECT 1 FROM deleted WHERE OrderStatus = 'Đã xác nhận')
    BEGIN
        RAISERROR('Không thể xóa đơn hàng đã xác nhận.', 16, 1)
        ROLLBACK TRANSACTION
        RETURN
    END

    -- Thực hiện xóa nếu đơn hàng chưa được xác nhận
    DELETE FROM Orders WHERE OrderID IN (SELECT OrderID FROM deleted);
END;

Giải thích:

  • trg_Orders_PreventDeleteConfirmedOrders: Tên trigger.
  • Orders: Tên bảng cần tạo trigger.
  • INSTEAD OF DELETE: Trigger được kích hoạt thay thế cho thao tác DELETE.
  • deleted: Bảng ảo lưu trữ dữ liệu của các bản ghi bị xóa.
  • IF EXISTS (SELECT 1 FROM deleted WHERE OrderStatus = ‘Đã xác nhận’): Kiểm tra xem có bản ghi nào bị xóa có trạng thái là ‘Đã xác nhận’ hay không.
  • RAISERROR(‘Không thể xóa đơn hàng đã xác nhận.’, 16, 1): Hiển thị thông báo lỗi nếu có bản ghi bị xóa có trạng thái là ‘Đã xác nhận’.
  • ROLLBACK TRANSACTION: Hủy bỏ thao tác DELETE.
  • RETURN: Thoát khỏi trigger.
  • DELETE FROM Orders WHERE OrderID IN (SELECT OrderID FROM deleted): Thực hiện xóa nếu đơn hàng chưa được xác nhận.

Bài tập 3: Tạo trigger tự động thêm bản ghi vào bảng AuditLog khi có bản ghi mới được thêm vào bảng Users.

CREATE TRIGGER trg_Users_LogNewUsers
ON Users
AFTER INSERT
AS
BEGIN
    INSERT INTO AuditLog (TableName, Action, ExecutionDate, Username, OldData, NewData)
    SELECT 'Users', 'INSERT', GETDATE(), USER_NAME(), NULL, 
           'Username: ' + inserted.Username + ', Email: ' + inserted.Email
    FROM inserted;
END;

Giải thích:

  • trg_Users_LogNewUsers: Tên trigger.
  • Users: Tên bảng cần tạo trigger.
  • AFTER INSERT: Trigger được kích hoạt sau khi có bản ghi mới được thêm vào bảng Users.
  • AuditLog: Tên bảng lưu trữ lịch sử thay đổi dữ liệu.
  • INSERT INTO AuditLog (…): Câu lệnh thêm bản ghi mới vào bảng AuditLog.
  • USER_NAME(): Hàm trả về tên người dùng hiện tại.
  • OldData: Dữ liệu cũ (trong trường hợp này là NULL vì là INSERT).
  • NewData: Dữ liệu mới (dữ liệu của bản ghi vừa được thêm vào).

Kết Luận

Bài viết đã giới thiệu về trigger trong SQL Server và cung cấp một số bài tập trigger có lời giải chi tiết. Hy vọng bài viết này sẽ giúp bạn hiểu rõ hơn về trigger và tự tin hơn trong việc ứng dụng trigger vào trong các dự án thực tế.

FAQ

1. Trigger có ảnh hưởng đến hiệu năng của hệ thống không?

Có, trigger có thể ảnh hưởng đến hiệu năng của hệ thống nếu không được thiết kế và sử dụng một cách hợp lý. Trigger được kích hoạt tự động và thực thi các câu lệnh SQL, do đó, nếu trigger chứa các câu lệnh phức tạp hoặc truy vấn dữ liệu lớn, nó có thể làm chậm quá trình xử lý dữ liệu.

2. Khi nào nên sử dụng trigger và khi nào không nên?

Nên sử dụng trigger khi bạn cần thực hiện các tác vụ tự động khi có sự thay đổi dữ liệu trên bảng, chẳng hạn như:

  • Kiểm tra tính toàn vẹn dữ liệu
  • Duy trì log các hoạt động trên bảng
  • Đồng bộ hóa dữ liệu giữa các bảng

Không nên sử dụng trigger khi:

  • Các tác vụ có thể được thực hiện bằng các phương pháp khác hiệu quả hơn (ví dụ: ràng buộc (constraint) trên bảng).
  • Trigger quá phức tạp và có thể ảnh hưởng đến hiệu năng của hệ thống.

3. Làm cách nào để kiểm tra xem một trigger có đang hoạt động hay không?

Bạn có thể sử dụng SQL Server Profiler để theo dõi các sự kiện trong SQL Server, bao gồm cả việc kích hoạt trigger. Ngoài ra, bạn cũng có thể kiểm tra bảng lịch sử thay đổi dữ liệu (nếu có) để xem trigger đã được kích hoạt và thực thi hay chưa.

Các Câu Hỏi Khác

Hỗ Trợ

Nếu cần hỗ trợ hãy liên hệ Số Điện Thoại: 02033846993, Email: [email protected] Hoặc đến địa chỉ: X2FW+GGM, Cái Lân, Bãi Cháy, Hạ Long, Quảng Ninh, Việt Nam. Chúng tôi có đội ngũ chăm sóc khách hàng 24/7.