(주) 망나니 힘집
[DB2] 트리거 개꾸르잼 TRIGGER 본문
무한 테이블 생성과 삭제를 반복한 후에 깨닫는 트리거 사용기입니당 ㅎ,ㅎ
🤩 상황
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 문법 호환 문제인지 내 실력 부족인지는 지금부터 다시 찾아봐야겟다
'스펙도 쌓니 > 코드 막짜니' 카테고리의 다른 글
[JWT] 액세스 토큰과 리프레시 토큰 (1) | 2025.01.30 |
---|---|
[사용자 인증 기술] 세션 인증 vs 토큰 인증 (0) | 2025.01.30 |