Thứ Ba, 25 tháng 7, 2023

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.

Mục lục

  • 1. INSTEAD OF trigger là gì?
  • 2. Ví dụ INSTEAD OF trigger
    • Bước 1: Tạo bảng brand_approvals
    • Bước 2: Tạo View vw_brands
    • Bước 3: Tạo trigger

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:

1
2
3
4
5
6
7
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:

SQL Server INSTEAD OF trigger illustration png

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.

1
2
3
4
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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é.

1
2
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.

1
2
3
4
5
SELECT
 brand_name,
 approval_status
FROM
 production.vw_brands;

SQL Server INSTEAD OF trigger example png

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

1
2
3
4
SELECT
 *
FROM
 production.brand_approvals;

SQL Server INSTEAD OF trigger pending table png

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.

=============================
* KHOÁ HỌC ORACLE DATABASE A-Z ENTERPRISE trực tiếp từ tôi giúp bạn bước đầu trở thành những chuyên gia DBA, đủ kinh nghiệm đi thi chứng chỉ OA/OCP, đặc biệt là rất nhiều kinh nghiệm, bí kíp thực chiến trên các hệ thống Core tại VN chỉ sau 1 khoá học.
* CÁCH ĐĂNG KÝ: Gõ (.) hoặc để lại số điện thoại hoặc inbox https://m.me/tranvanbinh.vn hoặc Hotline/Zalo 090.29.12.888
* Chi tiết tham khảo:
https://bit.ly/oaz_w
=============================
KẾT NỐI VỚI CHUYÊN GIA TRẦN VĂN BÌNH:
📧 Mail: binhoracle@gmail.com
☎️ Mobile/Zalo: 0902912888
👨 Facebook: https://www.facebook.com/BinhOracleMaster
👨 Inbox Messenger: https://m.me/101036604657441 (profile)
👨 Fanpage: https://www.facebook.com/tranvanbinh.vn
👨 Inbox Fanpage: https://m.me/tranvanbinh.vn
👨👩 Group FB: https://www.facebook.com/groups/DBAVietNam
👨 Website: https://www.tranvanbinh.vn
👨 Blogger: https://tranvanbinhmaster.blogspot.com
🎬 Youtube: https://www.youtube.com/@binhguru
👨 Tiktok: https://www.tiktok.com/@binhguru
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhguru
👨 Podcast: https://www.podbean.com/pu/pbblog-eskre-5f82d6
👨 Địa chỉ: Tòa nhà Sun Square - 21 Lê Đức Thọ - Phường Mỹ Đình 1 - Quận Nam Từ Liêm - TP.Hà Nội

=============================
oracle tutorial, học oracle database, Tự học Oracle, Tài liệu Oracle 12c tiếng Việt, Hướng dẫn sử dụng Oracle Database, Oracle SQL cơ bản, Oracle SQL là gì, Khóa học Oracle Hà Nội, Học chứng chỉ Oracle ở đầu, Khóa học Oracle online,sql tutorial, khóa học pl/sql tutorial, học dba, học dba ở việt nam, khóa học dba, khóa học dba sql, tài liệu học dba oracle, Khóa học Oracle online, học oracle sql, học oracle ở đâu tphcm, học oracle bắt đầu từ đâu, học oracle ở hà nội, oracle database tutorial, oracle database 12c, oracle database là gì, oracle database 11g, oracle download, oracle database 19c, oracle dba tutorial, oracle tunning, sql tunning , oracle 12c, oracle multitenant, Container Databases (CDB), Pluggable Databases (PDB), oracle cloud, oracle security, oracle fga, audit_trail,oracle RAC, ASM, oracle dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, postgresql tutorial, mysql tutorial, mariadb tutorial, ms sql server tutorial, nosql, mongodb tutorial, oci, cloud, middleware tutorial, hoc solaris tutorial, hoc linux tutorial, hoc aix tutorial, unix tutorial, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

Trần Văn Bình - Oracle Database Master