쿼리문에 트리거,, 질문 남깁니다. 0 3 1,397

by 조남규 [Oracle 기초] 오라클 트리거 [2022.10.31 10:27:22]


create or replace TRIGGER tr7_test
AFTER INSERT OR UPDATE OR DELETE ON EMP7
FOR EACH ROW
BEGIN
    IF UPDATING THEN
   INSERT INTO emp8(ENAME, AGE, PLANT, ROLE, ADROLE, EMAIL)
        SELECT :NEW.ENAME
                , :NEW.AGE
                , REGEXP_SUBSTR(REGEXP_SUBSTR(:NEW.AUTH, '[^|]+', 1, LEVEL), '[^,]+', 1)
                , REGEXP_SUBSTR(REGEXP_SUBSTR(:NEW.AUTH, '[^|]+', 1, LEVEL), '[^,]+', 1, 2)
                , REGEXP_SUBSTR(REGEXP_SUBSTR(:NEW.AUTH, '[^|]+', 1, LEVEL), '[^,]+', 1, 3)
                , :NEW.EMAIL
        FROM DUAL
        CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE(:NEW.AUTH, '[^|]+')) + 1;
   END IF;     
END;

 

트리거를 하나 만들었는데 

emp7테이블에 

UPDATE EMP7
SET AUTH = 'Seoul,1,A'
WHERE ENAME = 'KIM';

업데이트 하게되면

emp8 테이블에는

ENAME | AGE | PLANT | ROLE | ADROLE | EMAIL

   KIM   |  30  | Seoul   |   1   |      A     |  Kim1   <- 이렇게 입력이됩니다.

한 번 더 UPDATE EMP7
SET AUTH = 'Seoul,1,A | Busan,2,A'
WHERE ENAME = 'KIM';  

업데이트하게 되면

KIM   |  30  | Seoul   |   1   |      A     |  Kim1  

KIM   |  30  | Busan   |   2   |      A     |  Kim1   <- 이렇게 입력이됩니다.

혹시 여기서 궁금한게 emp8 Table은 로그 남기는 것 처럼 update 한 값들을 남기고 싶은데

UPDATE EMP7
SET AUTH = 'Seoul,1,A'
WHERE ENAME = 'KIM';  여기서 다시 한 번 더 업데이트를 하게될경우 (Busan 값 지우기)

KIM   |  30  | Seoul   |   1   |      A     |  Kim1  

KIM   |  30  | Busan   |   2   |      D     |  Kim1  이렇게 값을 남기고 싶지만 

실제 트리거를 사용하면 

KIM   |  30  | Seoul   |   1   |      A     |  Kim1   이값만 남게 됩니다.

UPDATE EMP7
SET AUTH = 'Seoul,1,A| Busan,2,D'
WHERE ENAME = 'KIM'; 

이렇게 업데이트하자고하니 |(파이프) 뒤 값은 없애고 싶은데 

조언 부탁드리겠습니다.!

 

 

by 마농 [2022.10.31 11:15:12]

적어주신 로직은 단순 인서트 로직만 있네요.
emp7 이 update 될 때마다 emp8 에는 insert 가 되겠네요.
지우거나 갱신하는 작업이 없으니 계속 추가 insert 가 되겠네요.
말씀하신 질문 내용은 뭔가 앞뒤가 안맞는 내용이네요.

아. 그리고 이전 질문 글에 답변 단 내용과 다르게 조건을 주셨네요.
- 댓글단것 : CONNECT BY LEVEL <= REGEXP_COUNT(v, '[^|]+')
- 작성한것 : CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(:NEW.AUTH, '[^|]+')) + 1
- 수정필요 : CONNECT BY LEVEL <= NVL(LENGTH(REGEXP_REPLACE(:NEW.AUTH, '[^|]+')), 0) + 1


by 조남규 [2022.10.31 13:03:15]

감사합니다 선생님!

제가 의도한 바는 emp7테이블이 업데이트 될 때마다 emp8에는 insert가 되도록 원한것이였는데

지우거나 갱식하는 작업이 필요한거겠죠 ?

emp7테이블에서 그러면 

UPDATE EMP7
SET AUTH = 'Seoul,1,A'
WHERE ENAME = 'KIM';

 

UPDATE EMP7
SET AUTH = 'Seoul,1,A|Beijing,2,D'
WHERE ENAME = 'KIM';

이렇게 해야지만 이력이 남게끔 할 수 있는건가요 ?

 

UPDATE EMP7
SET AUTH = 'Seoul,1,A'
WHERE ENAME = 'KIM';

위처럼 업데이트를 해서 

EMP8 테이블에

Kim | Seoul | 1 | A | 이메일

Kim | Beijing | 2 | D | 이메일

이력을 남길수는 없겠죠 ?

 


by 마농 [2022.10.31 14:30:53]

글쎄요? 이력인지? 내역인지? 분명히 해야 합니다.
1. 이력이라면? 이벤트마다 기록이 남아야 합니다.
- 위 처럼 계속 insert 해서 자료를 쌓으면 됩니다.
- 다만, 갱신일시 항목이 추가로 관리되어야 하겠지요.
2. 내역이라면? 최종분만 남으면 됩니다.
- 전체 삭제 후, 전체 입력하는 방식으로 하면 될 듯 합니다.

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