Tìm hiểu INSTEAD OF Trigger trong SQL Server

Trong bài này chúng ta sẽ học cách sử dụng INSTEAD OF trigger trong SQL Server, đây là tính năng cho phép bạn bỏ qua câu lệnh SQL INSERT, UPDATE hoặc DELETE.

1. INSTEAD OF trigger là gì?

INSTEAD OF trigger là một loại trigger đặc biệt, nó cho phép bạn bỏ qua câu lệnh INSERT, UPDATE hoặc DELETE trên một table hoặc view. Ví dụ bạn muốn khi có hành động delete trên table product thì bạn không xóa sản phẩm mà sẽ chạy một câu lệnh UPDATE status của product đó sang chế độ ẩn. Mặc dù bạn có thể không sử dung lệnh DELETE mà UPDATE trực tiếp cũng được, tuy nhiên để đảm bảo mọi câu truy vấn đều đúng thì nên sử dụng trigger.

Cú pháp của nó cũng không khá gì trigger:

CREATE TRIGGER [schema_name.] trigger_name
ON {table_name | view_name }
INSTEAD OF {[INSERT] [,] [UPDATE] [,] [DELETE] }
AS
BEGIN
    {sql_statements}
END

Mình sẽ không giải thích các tham số nữa vì bạn đã học nó rồi. Bây giờ ta sẽ thực hành một ví dụ để bạn dễ hiểu hơn.

2. Ví dụ INSTEAD OF trigger

Trong ví dụ này sử dụng database mẫu.

Một ví dụ điển hình của trigger đó là ghi đè dữ liệu của các thao tác insert, update, or delete trên view.

Giả sử một ứng dụng cần thêm một thương hiệu mới vào trong bảng brands, tuy nhiên các thương hiệu mới thì nên lưu trữ ở một bảng khác tên là brand_approvals để được phê duyệt, sau khi phê duyệt xong thì sẽ thêm nó vào bảng brands.

Để thực hiện điều này thì ta sẽ tạo một view tên là vw_brands để các ứng dụng thêm dữ liệu mới, nếu thương hiệu được thêm vào view thì INSTEAD OF trigger sẽ được kích hoạt và chèn vào bảng brand_approvals.

Hình ảnh sau đây minh họa quá trình này:

Các bước thực hiện như sau:

Bước 1: Tạo bảng brand_approvals

Hãy sử dụng câu lệnh SQL dưới đây để tạo bảng brand_approvals, bảng này sẽ lưu trữ các thương hiệu chưa được phê duyệt.

CREATE TABLE production.brand_approvals(
    brand_id INT IDENTITY PRIMARY KEY,
    brand_name VARCHAR(255) NOT NULL
);

Bước 2: Tạo View vw_brands

Bây giờ bạn hãy tạo view tên là vw_brands bằng câu SQL sau.

CREATE VIEW production.vw_brands 
AS
SELECT
    brand_name,
    'Approved' approval_status
FROM
    production.brands
UNION
SELECT
    brand_name,
    'Pending Approval' approval_status
FROM
    production.brand_approvals;

Dữ liệu ban dầu của view chính là dữ liệu của cả hai bảng brands và brand_approvals

Như vậy chúng ta sẽ có ba cách dùng:

  • Nếu muốn lấy tất cả thương hiệu thì lấy trong view vw_brands
  • Nếu muốn lấy thương hiệu đã được phê duyệt thì lấy trong bảng brands
  • Nếu muốn lấy thương hiệu chưa phê duyệt thì lấy trong bảng brand_approvals

Thực tế bạn có thể không sử dụng cách này mà thêm một fỉed status vào table brands, như vậy sẽ đơn giản hơn rất nhiều. Tuy nhiên vì các bạn đang học nên hãy tham khảo ví dụ này.

Bước 3: Tạo trigger

Ta sẽ cần một trigger gán vào view vw_brands, mỗi khi có thao tác insert vào view thì sẽ insert nó vào table brand_approvals.

CREATE TRIGGER production.trg_vw_brands 
ON production.vw_brands
INSTEAD OF INSERT
AS
BEGIN
    SET NOCOUNT ON;
    INSERT INTO production.brand_approvals ( 
        brand_name
    )
    SELECT
        i.brand_name
    FROM
        inserted i
    WHERE
        i.brand_name NOT IN (
            SELECT 
                brand_name
            FROM
                production.brands
        );
END

Bây giờ bạn hãy thử thêm một dòng dữ liệu vào view xem sao nhé.

INSERT INTO production.vw_brands(brand_name)
VALUES('Eddy Merckx');

Chạy câu truy vấn sau để xem dữ liệu hiện có trong view.

SELECT
 brand_name,
 approval_status
FROM
 production.vw_brands;

Hãy xem dữ liệu trong bảng brand_approvals.

SELECT 
 *
FROM 
 production.brand_approvals;

Như vậy trong bài này đã giới thiệu với các bạn cách sử dụng INSTEAD OF trigger trong SQL Server, đây là một chức năng rất hay và giúp các nhà thiết kế database có nhiều tùy chọn hơn trong việc phân tích mô hình CSDL.

Khóa học nên xem

Nguồn: freetuts.net