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 |