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';
이렇게 업데이트하자고하니 |(파이프) 뒤 값은 없애고 싶은데
조언 부탁드리겠습니다.!
적어주신 로직은 단순 인서트 로직만 있네요.
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
감사합니다 선생님!
제가 의도한 바는 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 | 이메일
이력을 남길수는 없겠죠 ?