Oracle PL / SQL - Beispiel für einen UPDATE-Trigger
Dieser Artikel zeigt Ihnen, wie SieAFTER UPDATE TRIGGER
verwenden. Er wird ausgelöst, nachdem der Aktualisierungsvorgang ausgeführt wurde.
1. Protokollierungsbeispiel
In diesem Beispiel wird nach jeder Aktualisierung in der Spalte "SALARY" vonemployee_salary
ein Trigger "after update" ausgelöst und die neuen aktualisierten Daten zu Prüfzwecken in die Tabelle "employee_salary_log
" eingefügt.
1.1 Create tables and trigger.
Mitarbeitergehalt
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
Aktualisieren Sie vor dem Update-Trigger nicht dieemployee_salary
-Tabelle. Es wird ein rekursiver Trigger erstellt und ausgeführt, bis der Arbeitsspeicher aufgebraucht ist.
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 | GEHALT | EMP_NAME |
---|---|---|
101 |
28000 |
Pranav |
201 |
40000 |
Vikram |
301 |
43000 |
Nikhil |
select * from EMPLOYEE_SALARY_LOG;
EMP_ID | NEW_SALARY | NEUES DATUM | AKTUALISIERT VON |
---|---|---|---|
101 |
28000 |
10-JUN-17 |
SYSTEM |
301 |
43000 |
10-JUN-17 |
SYSTEM |
2. Protokollierung mit WHEN-Bedingung
In diesem Beispiel wird nach jeder Aktualisierung in der Spalte "GEHALT" vonemployee_salary
mit einer Erhöhung von mehr als 50000 ein Auslöser "nach der Aktualisierung" ausgelöst und die neuen aktualisierten Daten in die Tabelle "employee_salary_log
" eingefügt.
2.1 Create tables and trigger.
Mitarbeitergehalt
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 | GEHALT | EMP_NAME |
---|---|---|
101 |
70000 |
Pranav |
201 |
45000 |
Vikram |
301 |
100000 |
Nikhil |
select * from EMPLOYEE_SALARY_HIKE_LOG;
EMP_ID | NEW_SALARY | HIKE | NEUES DATUM | AKTUALISIERT VON |
---|---|---|---|---|
101 |
70000 |
55000 |
10-JUN-17 |
HR |
301 |
100000 |
65000 |
10-JUN-17 |
HR |