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 |