테이블 이력(관련 테이블) 저장시 일련번호(Sequence) Trigger로 부여하기

 

샘플

CREATE TABLE TB_TEST1 (
    NUM NUMBER PRIMARY KEY,
    NM VARCHAR2(100)
);

CREATE TABLE TB_TEST2 (
    NUM NUMBER,
    IDX NUMBER DEFAULT NULL,
    NM VARCHAR2(100),
    CONSTRAINT PK_TB_TEST2 PRIMARY KEY (NUM, IDX),
    CONSTRAINT FK_TB_TEST1_TB_TEST2_01 FOREIGN KEY(NUM) REFERENCES TB_TEST1(NUM) ON DELETE CASCADE
);

CREATE SEQUENCE SQ_TB_TEST1
START WITH 1
INCREMENT BY 1
NOCYCLE;

CREATE OR REPLACE TRIGGER TG_TEST1
BEFORE INSERT OR UPDATE OF NM ON TB_TEST1
FOR EACH ROW
BEGIN
    INSERT INTO TB_TEST2(NUM, NM) VALUES (:NEW.NUM, :NEW.NM);
END;
/

CREATE OR REPLACE TRIGGER TB_TEST2
AFTER INSERT ON TB_TEST2
FOR EACH ROW
WHEN (NEW.IDX IS NULL)
BEGIN
     SELECT SQ_TB_TEST1.NEXTVAL INTO :NEW.IDX FROM DUAL;
END;
/

INSERT INTO TB_TEST1 VALUES (1, '한국');

SELECT * FROM TB_TEST1;

SELECT * FROM TB_TEST2;

UPDATE TB_TEST1 SET NM = '코리아' WHERE NUM = 1;

SELECT * FROM TB_TEST1;

SELECT * FROM TB_TEST2; 

 

TB_TEST2 의 IDX 값을 해당 NUM의 대한 일련번호를 사용할 경우에는 MAX를 사용해야 하나 FOR UPDATE를 사용하여 LOCK을 걸어야 하며 해당 ROW가 없을 경우에는 LOCK을 걸 수 없다.
그럴 경우 채번 테이블 생성하는 샘플을 보고 함수를 만들어 사용할 수 있다.

참고 : http://tyboss.tistory.com/entry/Oracle-채번-테이블-사용하여-채번하기-채번하기 

ALTER TABLE TB_TEST1 ADD IDX NUMBER DEFAULT 0; 

위처럼 TB_TEST1에 IDX 컬럼을 추가한 후 참고 링크의 채번 테이블 처럼 사용하면 된다.

 

 

+ Recent posts