Thứ Hai, 24 tháng 7, 2023

Tìm hiểu Trigger trong Oracle

Khi học bất kì một hệ quản trị CSDL nào bạn cũng phải tìm hiểu qua trigger, bởi đây là tính năng giúp bạn bảo vệ tính toàn vẹn dữ liệu, DBA sẽ kiểm soát được những thao tác từ lập trình viên code ứng dụng. Oracle cũng là một hệ QT CSDL nên không ngoại lệ.

Với những dự án lớn thì DBA sẽ cung cấp nhưng procedure, function cho lập trình viên, kèm theo đó là dữ liệu đầu vào và dữ liệu đầu ra. Như vậy lập trình viên sẽ không quan tâm đến nội dung bên câu SQL có gì, họ  chỉ cần biết INPUT và OUTPUT.

Mục lục

  • 1. Trigger trong Oracle là gì?
  • 2. After Trigger trong Oracle
  • 3. Before Trigger trong Oracle
  • 4. Disable trigger cho table
  • 5. Delete Trigger
  • 6. Enable trigger
  • 7. Lời kết

1. Trigger trong Oracle là gì?

Dịch ra tiếng Anh thì Trigger có nghĩa là cò súng, ý muốn nói rằng nó sẽ được kích hoạt khi có một thao tác nào đó lên cò súng này.

Trong hệ quản trị CSDL thì chúng ta có ba thao tác làm thay đổi dữ liệu chính đó là: UPDATE, INSERT và DELETE. Và đôi lúc bạn muốn thực hiện một hành động gì đó trước khi hoặc sau khi 3 lệnh đó xảy ra, và cái này ta gọi là trigger.

Như vậy chúng ta có 6 câu lệnh để tạo trigger chính, hay nói cách khác là 6 hành động và gom thành hai nhóm.

Nhóm before:

  • BEFORE INSERT TRIGGER
  • BEFORE UPDATE TRIGGER
  • BEFORE DELETE TRIGGER

Nhóm after:

  • AFTER INSERT TRIGGER
  • AFTER UPDATE TRIGGER
  • AFTER DELETE TRIGGER

Lưu ý:

  • Bạn không thể tạo Before Trigger cho View
  • Bạn không thể cập nhật dữ liệu cũ, chỉ co thể cập nhật dữ liệu mới.

Trước khi tìm hiểu trigger mình muốn tạo một bảng để thực hành như sau:

1
2
3
4
5
6
CREATE TABLE orders
( order_id number(5),
  quantity number(4),
  cost_per_item number(6,2),
  total_cost number(8,2)
);

Bảng này sẽ được dùng xuyên suốt bài học này.

2. After Trigger trong Oracle

After trigger là những trigger sẽ được thực thi sau khi hành động chính hoàn thành. 

Cú pháp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE [ OR REPLACE ] TRIGGER trigger_name 
AFTER INSERT OR UPDATE OR DELETE 
 ON table_name 
  [ FOR EACH ROW ] 
   
DECLARE 
   -- variable declarations 
    
BEGIN 
   -- trigger code 
    
EXCEPTION 
   WHEN ... 
   -- exception handling 
END;

Sau đây là một vài ví dụ về trigger trong Oracle.

AFTER DELETE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CREATE OR REPLACE TRIGGER orders_after_delete
AFTER DELETE
   ON orders
   FOR EACH ROW
 
DECLARE
   v_username varchar2(10);
 
BEGIN
 
   -- Find username of person performing the DELETE on the table
   SELECT user INTO v_username
   FROM dual;
 
   -- Insert record into audit table
   INSERT INTO orders_audit
   ( order_id,
     quantity,
     cost_per_item,
     total_cost,
     delete_date,
     deleted_by)
   VALUES
   ( :old.order_id,
     :old.quantity,
     :old.cost_per_item,
     :old.total_cost,
     sysdate,
     v_username );
 
END;

AFTER INSERT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
CREATE OR REPLACE TRIGGER orders_after_insert
AFTER INSERT
   ON orders
   FOR EACH ROW
 
DECLARE
   v_username varchar2(10);
 
BEGIN
 
   -- Find username of person performing the INSERT into the table
   SELECT user INTO v_username
   FROM dual;
 
   -- Insert record into audit table
   INSERT INTO orders_audit
   ( order_id,
     quantity,
     cost_per_item,
     total_cost,
     username )
   VALUES
   ( :new.order_id,
     :new.quantity,
     :new.cost_per_item,
     :new.total_cost,
     v_username );
 
END;

AFTER UPDATE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
CREATE OR REPLACE TRIGGER orders_after_update
AFTER UPDATE
   ON orders
   FOR EACH ROW
 
DECLARE
   v_username varchar2(10);
 
BEGIN
 
   -- Find username of person performing UPDATE into table
   SELECT user INTO v_username
   FROM dual;
 
   -- Insert record into audit table
   INSERT INTO orders_audit
   ( order_id,
     quantity_before,
     quantity_after,
     username )
   VALUES
   ( :new.order_id,
     :old.quantity,
     :new.quantity,
     v_username );
 
END;

3. Before Trigger trong Oracle

Before Trigger là những trigger sẽ thực thi trước hành động chính, nghĩa là xử lý nó xong thì hành động chính mới được thực hiện.

Cú pháp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE [ OR REPLACE ] TRIGGER trigger_name
BEFORE DELETE
   ON table_name
   [ FOR EACH ROW ]
 
DECLARE
   -- variable declarations
 
BEGIN
   -- trigger code
 
EXCEPTION
   WHEN ...
   -- exception handling
 
END;

Sau đây là một vài ví dụ:

BEFORE DELETE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CREATE OR REPLACE TRIGGER orders_before_delete
BEFORE DELETE
   ON orders
   FOR EACH ROW
 
DECLARE
   v_username varchar2(10);
 
BEGIN
 
   -- Find username of person performing the DELETE on the table
   SELECT user INTO v_username
   FROM dual;
 
   -- Insert record into audit table
   INSERT INTO orders_audit
   ( order_id,
     quantity,
     cost_per_item,
     total_cost,
     delete_date,
     deleted_by )
   VALUES
   ( :old.order_id,
     :old.quantity,
     :old.cost_per_item,
     :old.total_cost,
      sysdate,
      v_username );
 
END;

BEFORE INSERT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE [ OR REPLACE ] TRIGGER trigger_name
BEFORE INSERT
   ON table_name
   [ FOR EACH ROW ]
 
DECLARE
   -- variable declarations
 
BEGIN
   -- trigger code
 
EXCEPTION
   WHEN ...
   -- exception handling
 
END;

BEFORE UPDATE
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CREATE OR REPLACE TRIGGER orders_before_update
BEFORE UPDATE
   ON orders
   FOR EACH ROW
 
DECLARE
   v_username varchar2(10);
 
BEGIN
 
   -- Find username of person performing UPDATE on the table
   SELECT user INTO v_username
   FROM dual;
 
   -- Update updated_date field to current system date
   :new.updated_date := sysdate;
 
   -- Update updated_by field to the username of the person performing the UPDATE
   :new.updated_by := v_username;
 
END;

4. Disable trigger cho table

Nếu bạn muốn tắt một trigger đang hoạt động ở một table nào đó thì dùng cú pháp sau:

1
ALTER TRIGGER trigger_name DISABLE;

Nếu bạn muốn tắt tất cả trigger đang hoạt động ở một table nào đó thì dùng cú pháp sau:

Cú pháp
1
ALTER TABLE table_name DISABLE ALL TRIGGERS;

Trong đó table_name là tên table muốn xóa trigger.

5. Delete Trigger

Nếu bạn muốn xóa trigger vĩnh viễn thì sử dụng lệnh drop trigger.

1
DROP TRIGGER trigger_name;

6. Enable trigger

Nếu bạn muốn bật một trigger đã tắt cho table thì dùng cú pháp sau:

1
ALTER TRIGGER trigger_name ENABLE;

Nếu bạn muốn bật tất cả trigger đã tắt cho table thì dùng cú pháp sau:

1
ALTER TABLE table_name ENABLE ALL TRIGGERS;

7. Lời kết

Như vậy mình đã giới thiệu tất cả các chức năng mà Oracle hỗ trợ khi làm việc với trigger. Thực sự mà nói thì trigger đóng vai trò không thể thiếu, nó giúp cho DBA đảm bảo rằng dữ liệu luôn luôn được bảo toàn, tránh trường hợp không đồng nhất dữ liệu. 

=============================
* 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