Thứ Tư, 26 tháng 10, 2022

PL/SQL - Triggers

Trong chương này, chúng ta sẽ thảo luận về các Trigger . Trigger là các chương trình được lưu trữ, được tự động thực thi hoặc kích hoạt khi một số sự kiện xảy ra. Trên thực tế, các trình kích hoạt được viết ra để được thực thi để đáp ứng với bất kỳ sự kiện nào sau đây:

  • Câu lệnh thao tác cơ sở dữ liệu (DML) (DELETE, INSERT hoặc UPDATE)

  • Câu lệnh định nghĩa cơ sở dữ liệu (DDL) (CREATE, ALTER hoặc DROP).

  • Hoạt động cơ sở dữ liệu (SERVERERROR, LOGON, LOGOFF, STARTUP hoặc SHUTDOWN).

Trigger có thể được xác định trên bảng, dạng xem, lược đồ hoặc cơ sở dữ liệu mà sự kiện được liên kết với.

Lợi ích của Trigger

Kích hoạt có thể được viết cho các mục đích sau:

  • Tự động tạo một số giá trị cột có nguồn gốc

  • Thực thi tính toàn vẹn tham chiếu

  • Ghi nhật ký sự kiện và lưu trữ thông tin về quyền truy cập bảng

  • Kiểm toán

  • Sao chép đồng bộ các bảng

  • Áp đặt ủy quyền bảo mật

  • Ngăn chặn các giao dịch không hợp lệ

Tạo trigger

Cú pháp để tạo trình kích hoạt là:

CREATE [OR REPLACE ] TRIGGER trigger_name  

{BEFORE | AFTER | INSTEAD OF }  

{INSERT [OR] | UPDATE [OR] | DELETE}  

[OF col_name]  

ON table_name  

[REFERENCING OLD AS o NEW AS n]  

[FOR EACH ROW]  

WHEN (condition)   

DECLARE 

   Declaration-statements 

BEGIN  

   Executable-statements 

EXCEPTION 

   Exception-handling-statements 

END;

Ở đâu,

  • TẠO [HOẶC THAY THẾ] TRIGGER trigger_name - Tạo hoặc thay thế một trình kích hoạt hiện có bằng trigger_name .

  • {TRƯỚC | SAU | INSTEAD OF} - Điều này chỉ định thời điểm trình kích hoạt sẽ được thực thi. Mệnh đề INSTEAD OF được sử dụng để tạo trình kích hoạt trên một khung nhìn.

  • {CHÈN [HOẶC] | CẬP NHẬT [HOẶC] | DELETE} - Điều này chỉ định hoạt động DML.

  • [OF col_name] - Điều này chỉ định tên cột sẽ được cập nhật.

  • [ON table_name] - Tên này chỉ định tên của bảng được liên kết với trình kích hoạt.

  • [THAM KHẢO CŨ NHƯ o MỚI NHƯ n] - Điều này cho phép bạn tham khảo các giá trị mới và cũ cho các câu lệnh DML khác nhau, chẳng hạn như CHÈN, CẬP NHẬT và XÓA.

  • [FOR EACH ROW] - Điều này chỉ định trình kích hoạt cấp hàng, tức là trình kích hoạt sẽ được thực thi cho mỗi hàng bị ảnh hưởng. Nếu không, trình kích hoạt sẽ thực thi chỉ một lần khi câu lệnh SQL được thực thi, được gọi là trình kích hoạt cấp bảng.

  • WHEN (điều kiện) - Điều này cung cấp điều kiện cho các hàng mà trình kích hoạt sẽ kích hoạt. Mệnh đề này chỉ hợp lệ đối với trình kích hoạt cấp hàng.

Thí dụ

Để bắt đầu, chúng ta sẽ sử dụng bảng CUSTOMERS mà chúng ta đã tạo và sử dụng trong các chương trước -

Select * from customers;  


+----+----------+-----+-----------+----------+ 

| ID | NAME     | AGE | ADDRESS   | SALARY   | 

+----+----------+-----+-----------+----------+ 

|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 | 

|  2 | Khilan   |  25 | Delhi     |  1500.00 | 

|  3 | kaushik  |  23 | Kota      |  2000.00 | 

|  4 | Chaitali |  25 | Mumbai    |  6500.00 | 

|  5 | Hardik   |  27 | Bhopal    |  8500.00 | 

|  6 | Komal    |  22 | MP        |  4500.00 | 

+----+----------+-----+-----------+----------+ 


Chương trình sau tạo trình kích hoạt cấp hàng cho bảng khách hàng sẽ kích hoạt các hoạt động CHÈN hoặc CẬP NHẬT hoặc XÓA được thực hiện trên bảng KHÁCH HÀNG. Trình kích hoạt này sẽ hiển thị chênh lệch lương giữa giá trị cũ và giá trị mới -

CREATE OR REPLACE TRIGGER display_salary_changes 

BEFORE DELETE OR INSERT OR UPDATE ON customers 

FOR EACH ROW 

WHEN (NEW.ID > 0) 

DECLARE 

   sal_diff number; 

BEGIN 

   sal_diff := :NEW.salary  - :OLD.salary; 

   dbms_output.put_line('Old salary: ' || :OLD.salary); 

   dbms_output.put_line('New salary: ' || :NEW.salary); 

   dbms_output.put_line('Salary difference: ' || sal_diff); 

END; 

/

CREATE OR REPLACE TRIGGER system.hrsalary_audit AFTER UPDATE OF salary ON hr.employees REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW BEGIN IF :old.salary != :new.salary THEN INSERT INTO system.audit_employees VALUES (sys_context('userenv','os_user'), sysdate, sys_context('userenv','ip_address'), :new.employee_id || ' salary changed from '||:old.salary|| ' to '||:new.salary); END IF; END; /


Khi đoạn mã trên được thực thi tại dấu nhắc SQL, nó tạo ra kết quả sau:

Trigger created.



CREATE OR REPLACE TRIGGER SYSTEM.hrsalary_audit
    AFTER UPDATE OF salary
    ON hr.employees
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
BEGIN
    IF :old.salary != :new.salary
    THEN
        INSERT INTO SYSTEM.audit_employees
                 VALUES (
                            SYS_CONTEXT ('userenv', 'os_user'),
                            SYSDATE,
                            SYS_CONTEXT ('userenv', 'ip_address'),
                               :new.employee_id
                            || ' salary changed from '
                            || :old.salary
                            || ' to '
                            || :new.salary);
    END IF;
END;
/

Các điểm sau đây cần được xem xét ở đây:

  • Tham chiếu CŨ và MỚI không có sẵn cho trình kích hoạt cấp bảng, thay vào đó bạn có thể sử dụng chúng cho trình kích hoạt cấp bản ghi.

  • Nếu bạn muốn truy vấn bảng trong cùng một trình kích hoạt, thì bạn nên sử dụng từ khóa SAU, vì trình kích hoạt có thể truy vấn bảng hoặc thay đổi lại bảng chỉ sau khi áp dụng các thay đổi ban đầu và bảng trở lại trạng thái nhất quán.

  • Trình kích hoạt ở trên đã được viết theo cách mà nó sẽ kích hoạt trước bất kỳ thao tác XÓA hoặc CHÈN hoặc CẬP NHẬT nào trên bảng, nhưng bạn có thể viết trình kích hoạt của mình trên một hoặc nhiều thao tác, ví dụ: TRƯỚC KHI XÓA, thao tác này sẽ kích hoạt bất cứ khi nào một bản ghi sẽ bị xóa bằng thao tác DELETE trên bảng.

Kích hoạt một Trigger

Hãy để chúng tôi thực hiện một số thao tác DML trên bảng CUSTOMERS. Đây là một câu lệnh INSERT, sẽ tạo một bản ghi mới trong bảng -

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 

VALUES (7, 'Kriti', 22, 'HP', 7500.00 );

Khi một bản ghi được tạo trong bảng CUSTOMERS, trình kích hoạt tạo ở trên, display_salary_changes sẽ được kích hoạt và nó sẽ hiển thị kết quả sau:

Old salary: 

New salary: 7500 

Salary difference:


Bởi vì đây là một kỷ lục mới, lương cũ không có sẵn và kết quả trên là vô hiệu. Bây giờ chúng ta hãy thực hiện một thao tác DML nữa trên bảng CUSTOMERS. Câu lệnh UPDATE sẽ cập nhật một bản ghi hiện có trong bảng -

UPDATE customers 

SET salary = salary + 500 

WHERE id = 2;

Khi một bản ghi được cập nhật trong bảng CUSTOMERS, trình kích hoạt tạo ở trên, display_salary_changes sẽ được kích hoạt và nó sẽ hiển thị kết quả sau:

Old salary: 1500 

New salary: 2000 

Salary difference: 500


=============================
* 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: 0902912888
⚡️ Skype: tranbinh48ca
👨 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: http://bit.ly/ytb_binhoraclemaster
👨 Tiktok: https://www.tiktok.com/@binhoraclemaster?lang=vi
👨 Linkin: https://www.linkedin.com/in/binhoracle
👨 Twitter: https://twitter.com/binhoracle
👨 Đị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

=============================
PL/SQL, 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,khóa học pl/sql, 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 dataguard, oracle goldengate, mview, oracle exadata, oracle oca, oracle ocp, oracle ocm , oracle weblogic, middleware, hoc solaris, hoc linux, hoc aix, unix, securecrt, xshell, mobaxterm, putty

ĐỌC NHIỀU

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