CREATE TABLE TBL_ACS_CHK ( CHG_HIS_TYP_CD VARCHAR2(100), CHIS_DT DATE ) ; -- 이력 테이블 생성
CREATE OR REPLACE TRIGGER TR_TBL_CHK BEFORE -- 트리거 생성
DELETE OR INSERT OR UPDATE OR SELECT
ON SCOTT.EMP REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW DECLARE V_CHANGETYPE TR_TBL_CHK.CHG_HIS_TYP_CD%TYPE;
BEGIN IF INSERTING THEN V_CHANGETYPE :='I';
ELSIF UPDATING THEN V_CHANGETYPE :='U';
ELSIF DELETING THEN V_CHANGETYPE :='D';
ELSIF SELECTING THEN V_CHANGETYPE :='S';
END IF;
IF INSERTING
OR UPDATING THEN
INSERT
INTO TBL_ACS_CHK ( CHG_HIS_TYP_CD, CHIS_DT, IP_ADRESS, USERNAME, EMPNO, ENAME, JOB , MGR , HIREDATE , SAL , COMM , DEPTNO )
VALUES ( V_CHANGETYPE,
SYSDATE,
(SELECT SYS_CONTEXT('USERENV', 'IP_ADDRESS')
FROM DUAL),
(SELECT SYS_CONTEXT('USERENV', 'SESSION_USER')
FROM DUAL),
:NEW.EMPNO,
:NEW.ENAME,
:NEW.JOB ,
:NEW.MGR ,
:NEW.HIREDATE ,
:NEW.SAL ,
:NEW.COMM ,
:NEW.DEPTNO );
ELSIF DELETING THEN
INSERT
INTO TBL_ACS_CHK ( CHG_HIS_TYP_CD, CHIS_DT, IP_ADRESS, USERNAME, EMPNO, ENAME, JOB , MGR , HIREDATE , SAL , COMM , DEPTNO )
VALUES ( V_CHANGETYPE,
SYSDATE,
(SELECT SYS_CONTEXT('USERENV', 'IP_ADDRESS')
FROM DUAL),
(SELECT SYS_CONTEXT('USERENV', 'SESSION_USER')
FROM DUAL),
:OLD.EMPNO,
:OLD.ENAME,
:OLD.JOB ,
:OLD.MGR ,
:OLD.HIREDATE ,
:OLD.SAL ,
:OLD.COMM ,
:OLD.DEPTNO );
END IF;
EXCEPTION
WHEN OTHERS THEN RAISE;
END TR_TBL_CHK;
/
--테스트 트리거가 걸린 테이블에 INSERT, DELETE, UPDATE 작업을 하면 EMP 테이블에 이력 정보가 INSERT된다.
<TEST>
INSERT
INTO EMP
VALUES (8000,LEE,'CHIEF',1,'2023-05-09',1000,NULL,10);
DELETE EMP
WHERE EMPNO=8000 ;
COMMIT;
SELECT * FROM TBL_ACS_CHK; -- 이력테이블 조회로 내역 확인
'oracle' 카테고리의 다른 글
[ORACLE] VOTING DISK (0) | 2023.05.15 |
---|---|
[ORACLE] OCR (0) | 2023.05.11 |
[ORACLE] DBMS_METADATA.GET_DDL (0) | 2023.03.24 |
[ORACLE] ORA-00439: feature not enabled: Deferred Segment Creation (0) | 2023.03.22 |
[ORACLE] TABLE 통계정보 수집 (DBMS_STATS.GATHER_TABLE_STATS) (0) | 2023.03.13 |