Oracle PL / SQL - пример триггера после DELETE
В этой статье показано, как использоватьAFTER DELETE TRIGGER
, он сработает после выполнения операции удаления. В сценариях реальной жизни он в основном используется для следующих целей:
-
Аудит или ведение журнала
1. После триггера DELETE
В этом примере, если пользователь удалил строкуmedical_bills
, удаленная строка будет вставлена вmedical_bills_history
после триггера удаления в таблицеmedical_bills
1.1 Create tables and trigger.
Медицинские счета
CREATE TABLE medical_bills ( BILL_ID number(10) primary key, BILL_NUMBER varchar2(20), PARTY_NAME varchar2(50), BILL_DATE date, CREATED_BY varchar2(20), CREATED_DATE date );
медицинские_счета_история
CREATE TABLE medical_bills_history ( BILL_ID number(10), BILL_NUMBER varchar2(20), PARTY_NAME varchar2(50), BILL_DATE date, DELETED_BY varchar2(20), DELETED_DATE date );
trg_after_delete_bill
CREATE OR REPLACE TRIGGER trg_after_delete_bill AFTER DELETE ON medical_bills FOR EACH ROW DECLARE username varchar2(10); BEGIN -- current login user, in this example, system SELECT user INTO username FROM dual; -- Insert OLD values in history table with username of user performing delete and sysdate as deleted_Date. INSERT INTO medical_bills_history VALUES(:OLD.BILL_ID, :OLD.BILL_NUMBER,:OLD.PARTY_NAME,:OLD.BILL_DATE,username,sysdate); END;
1.2 Insert data for testing.
INSERT INTO MEDICAL_BILLS values (1,'BILL101','Peter Thomas','12-MAY-2016','HR',sysdate); INSERT INTO MEDICAL_BILLS values (2,'BILL102','Jemes Petil','10-JUN-2016','HR',sysdate); INSERT INTO MEDICAL_BILLS values (3,'BILL103','Fujit su','10-JUL-2015','HR',sysdate);
1.3 Display the data.
select * from MEDICAL_BILLS;
BILL_ID | НОМЕР СЧЕТА | PARTY_NAME | BILL_DATE | СОЗДАН | ДАТА СОЗДАНИЯ |
---|---|---|---|---|---|
1 |
BILL101 |
Питер Томас |
12-МАЯ-2016 |
HR |
18-ИЮН-2017 |
2 |
BILL102 |
Jemes Petil |
10-ИЮН-2016 |
HR |
18-ИЮН-2017 |
3 |
BILL103 |
Fujit su |
10-ИЮЛ-2015 |
HR |
18-ИЮН-2017 |
select * from MEDICAL_BILLS_HISTORY; -- no result
1.4 Delete some rows from table MEDICAL_BILLS
DELETE FROM MEDICAL_BILLS WHERE bill_id = 1; DELETE FROM MEDICAL_BILLS WHERE bill_id = 3;
1.5 Display the data again.
select * from MEDICAL_BILLS;
BILL_ID | НОМЕР СЧЕТА | PARTY_NAME | BILL_DATE | СОЗДАН | ДАТА СОЗДАНИЯ |
---|---|---|---|---|---|
2 |
BILL102 |
Jemes Petil |
10-ИЮН-2016 |
HR |
18-ИЮН-2017 |
select * from MEDICAL_BILLS_HISTORY;
BILL_ID | НОМЕР СЧЕТА | PARTY_NAME | BILL_DATE | СОЗДАН | ДАТА СОЗДАНИЯ |
---|---|---|---|---|---|
1 |
BILL101 |
Питер Томас |
12-МАЯ-2016 |
СИСТЕМА |
18-ИЮН-2017 |
3 |
BILL103 |
Fujit su |
10-ИЮЛ-2015 |
СИСТЕМА |
18-ИЮН-2017 |