스펙도 쌓니/코드 막짜니

[DB2] 트리거 개꾸르잼 TRIGGER

군포망나니 2025. 4. 28. 14:35

무한 테이블 생성과 삭제를 반복한 후에 깨닫는 트리거 사용기입니당 ㅎ,ㅎ

 

🤩 상황 

TABLE 을 생성하고 TABLE_HISTORY 도 업데이트 쳐야함. 
대신 CREATE와 DELETE 일 때만 삽입한다. 

-- TABLE DB 생성 
CREATE TABLE TABLE (   
    CD_PARTNER VARCHAR(10) NOT NULL,
    CD_COMPANY VARCHAR(10) NOT NULL,
    TXT_REMARK VARCHAR(100) DEFAULT '', 
    ID_INSERT  VARCHAR(20) NOT NULL,
    DT_INSERT  TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    ID_UPDATE  VARCHAR(20) NOT NULL,
    DT_UPDATE  TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    
    PRIMARY KEY (CD_PARTNER, CD_COMPANY)
);

-- TABLE 히스토리 DB 생성  
CREATE TABLE  TABLE_HIST (         
    DT_WORK TIMESTAMP DEFAULT NOT NULL,
    ID_WORK VARCHAR(20) NOT NULL, 
    IUD_GUBUN VARCHAR(1) NOT NULL, -- C/D 
    CD_PARTNER VARCHAR(10) NOT NULL, 
    CD_COMPANY VARCHAR(10) NOT NULL,
    TXT_REMARK VARCHAR(100) DEFAULT '',  
    ID_INSERT  VARCHAR(20) NOT NULL,
    DT_INSERT  TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
    ID_UPDATE  VARCHAR(20),
    DT_UPDATE  TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    
    PRIMARY KEY (DT_WORK, IUD_GUBUN, CD_PARTNER, CD_COMPANY, ID_WORK)
);

 

🤩 DAO 작성인가,,, TRIGGER 작성인가 그것이 문제이로오다. 

 

DAO 로 작성하면 귀찮자나요... 

TRIGGER 실패하면 쩔수로 DAO 쓸라 했는데 성공해버렷어요 (다행히 한 테이블에 여러 트리거 적용이 됩니다:) 

 

근데 난 기존에 있는 트리거 목록을 볼 수 있는 명령어가..... 인터넷과 달라서 그것도 찾아봐야 합.... 

 

🤩 TABEL 수정일 UPDATE TRIGGER 

-- 수정일 업데이트 트리거  
CREATE TRIGGER DT_UP_TRIGGER
   BEFORE UPDATE ON TABLE
   REFERENCING NEW AS N
   FOR EACH ROW MODE DB2SQL
   SET N.DT_UPDATE = CURRENT_TIMESTAMP
   INSERT INTO B_PARTNER_STOP_OUT_HIST(DT_WORK, ID_WORK, IUD_GUBUN, CD_PARTNER, CD_COMPANY, TXT_REMARK, ID_INSERT, DT_INSERT, ID_UPDATE, DT_UPDATE) VALUES(SYSDATE, 'UPDATE', N.COLUMN)

 

이렇게 작성하면 데이터 수정 시에 자동으로 수정일을 넣어준다 

 

🤩 TABEL 수정 시에 자동으로 HISTORY 삽입 (CREATE, DELETE 만) 

-- 히스토리 (인서트) 트리거 
CREATE TRIGGER TABLE_IN_TRIGGER
AFTER INSERT ON TABLE
REFERENCING NEW AS N
FOR EACH ROW MODE DB2SQL
 
    INSERT INTO TABLE_HIST (
        DT_WORK, 
        ID_WORK,
        IUD_GUBUN, 
        CD_PARTNER, 
        CD_COMPANY, 
        TXT_REMARK,
        ID_INSERT,
        DT_INSERT,
        ID_UPDATE,
        DT_UPDATE 
        
    )
    VALUES (
        CURRENT_TIMESTAMP,   
         COALESCE(USER, ''),  
        'C',            
        N.CD_PARTNER,       
        N.CD_COMPANY,       
        COALESCE(N.TXT_REMARK, ''),
        N.ID_INSERT,
        N.DT_INSERT,
        COALESCE(ID_UPDATE, NULL),
        COALESCE(DT_UPDATE, NULL) 
    )

 

CREATE TRIGGER TABLE_DEL_TRIGGER
AFTER DELETE ON TABLE
REFERENCING OLD AS O 
FOR EACH ROW MODE DB2SQL
 
    INSERT INTO TABLE_HIST (
        DT_WORK, 
        ID_WORK,
        IUD_GUBUN, 
        CD_PARTNER, 
        CD_COMPANY, 
        TXT_REMARK,
        ID_INSERT,
        DT_INSERT, 
        ID_UPDATE,
        DT_UPDATE
    )
    VALUES (
        CURRENT_TIMESTAMP,   -- DT_WORK: 현재 시간 기록
         COALESCE(USER, ''),  -- 삭제된 값이 NULL일 경우 빈 문자열
        'D',                 -- IUD_GUBUN: 'D'는 삭제(Delete)를 의미
        O.CD_PARTNER,       -- CD_PARTNER: 삭제된 값(O)에서 가져옴
        O.CD_COMPANY,       -- CD_COMPANY: 삭제된 값(O)에서 가져옴
        COALESCE(O.TXT_REMARK, ''),  -- TXT_REMARK: 삭제된 값(O)에서 가져옴, NULL이면 빈 문자열
        O.ID_INSERT,         -- ID_INSERT: 삭제된 값(O)에서 가져옴
        O.DT_INSERT,         -- DT_INSERT: 삭제된 값(O)에서 가져옴
        O.ID_UPDATE,         -- ID_UPDATE: 삭제된 값(O)에서 가져옴
        O.DT_UPDATE          -- DT_UPDATE: 삭제된 값(O)에서 가져옴
    )

 

무사히 작동하지만, 무결성은... 지켰을까...? 

 

근데 BEGIN IF END 이거 하려다가 에러가 너무 나서 실패했아요/.. 

 

세미콜론도 제약이 있고

 

DB2 문법 호환 문제인지 내 실력 부족인지는 지금부터 다시 찾아봐야겟다