Oracle PL / SQL - пример триггера после UPDATE
В этой статье показано, как использоватьAFTER UPDATE TRIGGER
, он сработает после выполнения операции обновления.
1. Пример регистрации
В этом примере после каждого обновления столбца «SALARY»employee_salary
он запускает триггер «after update» и вставляет новые обновленные данные в таблицу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 |
Pranav |
201 |
40000 |
Викрам |
301 |
43000 |
Нихилу |
select * from EMPLOYEE_SALARY_LOG;
EMP_ID | NEW_SALARY | UPDATED_DATE | UPDATED_BY |
---|---|---|---|
101 |
28000 |
10-ИЮН-17 |
СИСТЕМА |
301 |
43000 |
10-ИЮН-17 |
СИСТЕМА |
2. Ведение журнала с условием WHEN
В этом примере после каждого обновления столбца «SALARY»employee_salary
с повышением, превышающим 50000, он запускает триггер «после обновления» и вставляет новые обновленные данные в таблицу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 |
Pranav |
201 |
45000 |
Викрам |
301 |
100000 |
Нихилу |
select * from EMPLOYEE_SALARY_HIKE_LOG;
EMP_ID | NEW_SALARY | HIKE | UPDATED_DATE | UPDATED_BY |
---|---|---|---|---|
101 |
70000 |
55000 |
10-ИЮН-17 |
HR |
301 |
100000 |
65000 |
10-ИЮН-17 |
HR |