Exemple Oracle PL / SQL - After UPDATE Trigger
Cet article vous montre comment utiliserAFTER UPDATE TRIGGER
, il se déclenchera après l'exécution de l'opération de mise à jour.
1. Exemple de journalisation
Dans cet exemple, après chaque mise à jour de la colonne «SALAIRE» deemployee_salary
, il déclenchera un déclencheur «après la mise à jour» et insérera les nouvelles données mises à jour dans une tableemployee_salary_log
, à des fins d'audit.
1.1 Create tables and trigger.
salaire_employé
CREATE TABLE employee_salary ( EMP_ID number(10), SALARY number(10), EMP_NAME varchar2(50) );
Employee_salary_log
CREATE TABLE employee_salary_log ( EMP_ID number(10), NEW_SALARY number(10), UPDATED_DATE date, UPDATED_BY varchar2(20) );
trg_log_employee_salary
CREATE OR REPLACE TRIGGER trg_log_employee_salary AFTER UPDATE OF SALARY ON employee_salary FOR EACH ROW DECLARE username varchar2(20); BEGIN -- get current login user SELECT USER INTO username FROM dual; -- Insert new values into log table. INSERT INTO employee_salary_log VALUES ( :NEW.EMP_ID, :NEW.SALARY, sysdate, username); END;
Note
Avant le déclenchement de mise à jour, ne mettez pas à jour la tableemployee_salary
, il créera un déclencheur récursif et s'exécutera jusqu'à ce qu'il soit à court de mémoire.
1.2 Insert data to test the trigger.
INSERT INTO employee_salary VALUES (101,15000,'Pranav'); INSERT INTO employee_salary VALUES (201,40000,'Vikram'); INSERT INTO employee_salary VALUES (301,35000,'Nikhil'); -- fire trigger, insert into log table UPDATE employee_salary SET SALARY = '28000' WHERE emp_id = 101; -- fire trigger, insert into log table UPDATE employee_salary SET SALARY = '43000' WHERE emp_id = 301;
1.3 Display the data.
select * from EMPLOYEE_SALARY;
EMP_ID | UN SALAIRE | EMP_NAME |
---|---|---|
101 |
28000 |
Pranav |
201 |
40000 |
Vikram |
301 |
43000 |
Nikhil |
select * from EMPLOYEE_SALARY_LOG;
EMP_ID | NEW_SALARY | UPDATED_DATE | MIS À JOUR PAR |
---|---|---|---|
101 |
28000 |
10-JUIN-17 |
SYSTÈME |
301 |
43000 |
10-JUIN-17 |
SYSTÈME |
2. Journalisation avec condition WHEN
Dans cet exemple, après chaque mise à jour de la colonne «SALAIRE» deemployee_salary
avec une hausse supérieure à 50000, il déclenchera un déclencheur «après la mise à jour» et insérera les nouvelles données mises à jour dans une tableemployee_salary_log
.
2.1 Create tables and trigger.
salaire_employé
CREATE TABLE employee_salary ( EMP_ID number(10), SALARY number(10), EMP_NAME varchar2(50) );
Employee_salary_hike_log
CREATE TABLE employee_salary_hike_log ( EMP_ID number(10), NEW_SALARY number(10), HIKE number(10), UPDATED_DATE date, UPDATED_BY varchar2(20) );
trg_log_salary_hike
CREATE OR REPLACE TRIGGER trg_log_salary_hike AFTER UPDATE OF SALARY ON employee_salary FOR EACH ROW WHEN ((NEW.SALARY - OLD.SALARY) > 50000) DECLARE username varchar2(20); BEGIN SELECT USER INTO username FROM dual; -- Insert new values into log table. INSERT INTO employee_salary_hike_log VALUES ( :NEW.EMP_ID, :NEW.SALARY, :NEW.SALARY - :OLD.SALARY ,sysdate, username); END;
2.2 Insert data to test the trigger.
INSERT INTO employee_salary VALUES (101,15000,'Pranav'); INSERT INTO employee_salary VALUES (201,40000,'Vikram'); INSERT INTO employee_salary VALUES (301,35000,'Nikhil'); -- new salary - old salary > 50000, fire after update trigger, insert into log UPDATE employee_salary SET SALARY = '70000' WHERE emp_id = 101; UPDATE employee_salary SET SALARY = '100000' WHERE emp_id = 301; -- new salary - old salary < 50000, no action. UPDATE employee_salary SET SALARY = '45000' WHERE emp_id = 201;
2.3 Display the data.
select * from EMPLOYEE_SALARY;
EMP_ID | UN SALAIRE | EMP_NAME |
---|---|---|
101 |
70000 |
Pranav |
201 |
45000 |
Vikram |
301 |
100000 |
Nikhil |
select * from EMPLOYEE_SALARY_HIKE_LOG;
EMP_ID | NEW_SALARY | HIKE | UPDATED_DATE | MIS À JOUR PAR |
---|---|---|---|---|
101 |
70000 |
55000 |
10-JUIN-17 |
HR |
301 |
100000 |
65000 |
10-JUIN-17 |
HR |