-- USER_INFO 테이블에 -- 컬럼은 USER_ID, PASS_WORD, LOGIN_DATE가 있다고 봅니다. -- 로그테이블은 USER_INFO_LOG(USER_ID, LOG_DATE, PASS_WORD, LOGIN_DATE)라고 봅니다. CREATE OR REPLACE TRIGGER TG_USER_INFO_HIS BEFORE UPDATE ON USER_INFO FOR EACH ROW DECLARE CNT NUMBER; BEGIN IF UPDATING THEN -- 업데이트하려는 모든 컬럼은 같으나 LOGIN_DATE만 다른 로우 COUNT SELECT COUNT(*) INTO CNT FROM USER_INFO WHERE USER_ID = :NEW.USER_ID AND PASS_WORD = :NEW.PASS_WORD AND LOGIN_DATE <> :NEW.LOGIN_DATE; IF CNT = 0 THEN INSERT INTO USER_INFO_LOG(USER_ID, LOG_DATE, PASS_WORD, LOGIN_DATE) VALUES(:NEW.USER_ID, SYSDATE, :NEW.PASS_WORD, :NEW.LOGIN_DATE); END IF; END IF; END;
하단과 같이 트리거 생성시 login_date 에 대한 처리를 빼고 나머지 업데이트 할 필드정보에
대해서 정보가 변경될때 변경된 정보를 저장하면 될거 같네요
CREATE TRIGGER T_tri BEFORE UPDATE ON table
FOR EACH ROW
BEGIN
DECLARE LOGDESC VARCHAR(1024);
DECLARE MOD_CHK char(1);
SET LOGDESC = '';
SET MOD_CHK = 0;
IF NEW.field1 != OLD.field1 THEN
Set LOGDESC = CONCAT(LOGDESC,' field1,');
SET MOD_CHK = 1;
END IF;
IF NEW.field2 != OLD.field2 THEN
Set LOGDESC = CONCAT(LOGDESC,' field2,');
SET MOD_CHK = 1;
END IF;
Set LOGDESC = MID(LOGDESC,2,LENGTH(LOGDESC)-1);
if LENGTH(LogDesc) > 252 then
Set LOGDESC = CONCAT(MID(LOGDESC,1,252),'...');
END IF;
IF MOD_CHK = 1 THEN
INSERT INTO table_log VALUES (
OLD.field1
,OLD.field1
);
ELSE
SET NEW.Update_cnt = NEW.Update_cnt -1;
END IF;
IF NEW.Update_cnt < 0 THEN
SET NEW.Update_cnt = 0;
END IF;
END;