0. 기존트리거 조회

SELECT  'ALTER TRIGGER ' || TRIGGER_NAME || ' DISABLE;'  AS SCRIPT_DISABLE
,       'ALTER TRIGGER ' || TRIGGER_NAME || ' ENABLE;'   AS SCRIPT_ENABLE
,       TRIGGER_NAME
,       STATUS
,       TRIGGER_TYPE
,       TRIGGERING_EVENT
,       TABLE_NAME 
FROM USER_TRIGGERS;

 

1. 문서번호 채번함수

CREATE OR REPLACE FUNCTION GETSEQ RETURN VARCHAR2
IS
        V_RTN VARCHAR(14);
BEGIN
        V_RTN := TO_CHAR(SYSDATE, 'YYYYMMDDHH24MISS');
  
        RETURN V_RTN;
END;

 

2. TEST용 테이블 생성

CREATE TABLE TAB1
(       ID VARCHAR2(30)
,       NAME VARCHAR2(30));

CREATE TABLE TAB2
(       DOCNO VARCHAR2(30)
,       ID VARCHAR2(30));

ALTER TABLE TAB2
 ADD CONSTRAINT PK_TAB2 PRIMARY KEY (DOCNO);

 

3. TAB1 Trigger 생성(TAB1에 insert, delete시 TAB2에도 insert, delete)

CREATE OR REPLACE TRIGGER TR_INSERT
AFTER INSERT OR UPDATE OR DELETE ON TAB1
FOR EACH ROW
DECLARE

    PRAGMA AUTONOMOUS_TRANSACTION;

BEGIN
        IF INSERTING THEN

                INSERT INTO TAB2 VALUES (GETSEQ(), :NEW.ID);
                
                -- 중복입력 테스트용
                -- PRAGMA AUTONOMOUS_TRANSACTION;의 선언여부와는 상관없이
                -- EXCEPTION 처리 구문이 있다면 TAB1에는 정상입력된다. 
                -- EXCEPTION 처리 구문이 없다면 TAB1에도 입력되지 않는다. 
                -- INSERT INTO TAB2 VALUES (0, :NEW.ID);

        ELSIF UPDATING THEN

                UPDATE TAB2 SET DOCNO = 'TEST';

        ELSIF DELETING THEN

                DELETE TAB2 WHERE TAB2.ID = :OLD.ID;
        
        END IF;
        
        EXCEPTION
                WHEN OTHERS THEN
                        DBMS_OUTPUT.PUT_LINE(SQLERRM);        
END;

 

4. TAB2 Trigger 생성(TAB2에 ID만 입력시 문서번호자동 자동입력)

CREATE OR REPLACE TRIGGER TR_INSERT2 
BEFORE INSERT ON TAB2
FOR EACH ROW
BEGIN
        :NEW.DOCNO := GETSEQ();
END;

 

5. TAB1에 INSERT

INSERT INTO TAB1 VALUES ('A', 'A모씨');
INSERT INTO TAB1 VALUES ('B', 'B모씨');

SELECT * FROM TAB1;
ID                             NAME                         
------------------------------ ------------------------------
A                              A모씨                          
B                              B모씨                          

SELECT * FROM TAB2;
DOCNO                          ID                           
------------------------------ ------------------------------
20130216131044                 B                              
20130216131043                 A            

 

6. TAB1에 DELETE

DELETE FROM TAB1 WHERE ID = 'A';

SELECT * FROM TAB1;
ID                             NAME                         
------------------------------ ------------------------------
B                              B모씨                          

SELECT * FROM TAB2;
DOCNO                          ID                           
------------------------------ ------------------------------
20130216131044                 B                              

 

7. TAB2에 INSERT

INSERT INTO TAB2 (ID) VALUES ('Z');

SELECT * FROM TAB1;
ID                             NAME                         
------------------------------ ------------------------------
B                              B모씨                          

SELECT * FROM TAB2;
DOCNO                          ID                           
------------------------------ ------------------------------
20130216131044                 B                              
20130216131308                 Z