Oracle PL/SQL - UPDATEトリガの例

Oracle PL / SQL – UPDATEトリガー後の例

この記事では、AFTER UPDATE TRIGGERの使用方法を説明します。これは、更新操作の実行後に起動します。

1. ロギングの例

この例では、employee_salaryの「SALARY」列を更新するたびに、「更新後」トリガーを起動し、監査目的で、更新された新しいデータをemployee_salary_logテーブルに挿入します。

1.1 Create tables and trigger.

employee_salary

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
更新トリガーの前に、employee_salaryテーブルを更新しないでください。再帰的にトリガーが作成され、メモリが不足するまで実行されます。

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 給料 EMP_NAME

101

28000

プラナフ

201

40000

ヴィクラム

301

43000

ニヒル

select * from EMPLOYEE_SALARY_LOG;
EMP_ID NEW_SALARY UPDATED_DATE UPDATED_BY

101

28000

2017年6月10日

システム

301

43000

2017年6月10日

システム

2. WHEN条件でのロギング

この例では、50000を超えるハイキングでemployee_salaryの「SALARY」列を更新するたびに、「更新後」トリガーを起動し、新しく更新されたデータをemployee_salary_logテーブルに挿入します。

2.1 Create tables and trigger.

employee_salary

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 給料 EMP_NAME

101

70000

プラナフ

201

45000

ヴィクラム

301

100000

ニヒル

select * from EMPLOYEE_SALARY_HIKE_LOG;
EMP_ID NEW_SALARY HIKE UPDATED_DATE UPDATED_BY

101

70000

55000

2017年6月10日

HR

301

100000

65000

2017年6月10日

HR