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 |