특정필드가 업데이트 할때 제외하고 변경 정보를 남기고 싶습니다. 0 6 4,940

by 경상도곰남 [SQL Query] [2015.08.11 19:12:18]


트리거를 쓰려고 하는데요..

특정 컬럼의 값이 변할때만 제외하고 업데이터 정보를 저장하고 싶습니다.

회원정보 테이블에 login_date라는 필드가 없데이트를 하는것을 제외하고 다른 정보가 변경될때 변경되는 정보를 저장하고 싶습니다.

고수님들의 답변 부탁드립니다.

 

 

by 창조의날개 [2015.08.12 09:06:38]

-- 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;

 


by 마농 [2015.08.13 15:08:04]

트리거 안에서 트리거 걸린 테이블을 참조하면 안됩니다.

mutating 에러(ORA-04091)


by 창조의날개 [2015.08.13 16:41:22]

아~ 그렇죠..

역시 테스트를 못해봐서.. 그걸 깜빡 했네요..


by 다솜 [2015.08.12 09:10:06]

하단과 같이 트리거 생성시 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;


by 마농 [2015.08.13 15:15:05]
-- UPDATE 쪽에 OF 를 사용하여 대상 컬럼리스트를 적어주세요.
CREATE OR REPLACE TRIGGER tri_emp_test
AFTER UPDATE
OF empno, ename, mgr    -- 요기.
ON emp
FOR EACH ROW
BEGIN
    null;
END;
/

 


by 경상도곰남 [2015.08.17 17:50:28]

답변 감사합니다. ^^

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입