Oracle PL/SQL - Exemple après UPDATE Trigger

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