oracle update trigger관련 문의 0 5 810

by 와일드키드 [Oracle 기초] [2020.06.03 14:14:49]


emp테이블을 다른 db로 copy하는 DML tigger를 테스트 중에 있습니다.

조건은 emp테이블의 모든 변경분에 대하여 다른 db로 copy해야합니다. 

결국 table copy가 되는의미? 이렇게 되면 CDC나 Mview를 쓰는게 맞는데

혹시나하여 우선 테스트로 update만 하는 trigger를 아래처럼 작성후 어떤 조건이 들어 올지 모르는 상태?

CREATE or REPLACE trigger EMP_TRIGGER
AFTER INSERT OR DELETE OR UPDATE ON  EMP
FOR EACH ROW
BEGIN
IF UPDATING THEN
UPDATE EMP@TESTDB SET EMPNO=:NEW.EMPNO, ENAME=:NEW.ENAME, JOB=:NEW.JOB, MGR=:NEW.MGR, HIREDATE=:NEW.HIREDATE, SAL=:NEW.SAL, COMM=:NEW.COMM, DEPTNO=:NEW.DEPTNO
   WHERE EMPNO=:OLD.EMPNO AND ENAME=:OLD.ENAME AND JOB=:OLD.JOB AND MGR=:OLD.MGR AND HIREDATE=:OLD.HIREDATE AND SAL=:OLD.SAL AND COMM=:OLD.COMM AND DEPTNO=:OLD.DEPTNO;
END IF;
END;
/

update를 아래처럼 source쪽에서 실행했습니다.

SQL>update emp set  ENAME='TT', JOB='SS-SS' where  empno in (8888,7566);

commit;

target쪽에 emp가 8888 인 로우만 ENAME='TT', JOB='SS-SS'로 변경되었고 emp=7566인 로우는 변경이 안되고 그대로입니다.

왜 하나의 row만 될까요? 

제가 트리거를 잘못 짠건지 아니면 트리거로 될 수 없는것인데 삽질하는 것인지 확인좀 부탁드리겠습니다.

by 생각 [2020.06.03 15:46:42]

보통 이관 테이블 생성 시에 트리거는 INSERT 해주고, UPDATE 하는 식으로 적용하시는게 좋습니다.

특히 업데이트시 컬럼을 전부 나열하는게 아니라 PK만 잡아주시고 변경이 되는 데이터만 SET으로 적용해주면 됩니다.


by 와일드키드 [2020.06.03 16:18:30]

답변 감사합니다.

pk가 없는 테이블에대하여 이관이 아닌 실시간 데이타 copy로 테스트 하려 합니다.

pk가 있는 테이블도 있습니다만......

저도 trigger를 짜 놓고 정상적인 것인지 안되는것을 하려는 멍청한 짓인지 모르겠네요

누가 도와 주셨으면 참 좋겠네요 ㅠㅠ


by 마농 [2020.06.03 18:25:56]

PK 가 없다면? UK 라도 있어야 합니다.
이마저도 없다면? 이렇게 하면 안 될 것 같은데요?
해야 한다면? PK 를 만들어서 해야 합니다.
조건은 PK (empno) 하나만 주면 됩니다.


by 와일드키드 [2020.06.04 09:26:52]

마농님, 답변 진심 감사합니다.

말씀하신데로 PK를 만들고 해야 겠습니다.  고민을 해결해 주셔서 감사드립니다.


by 마농 [2020.06.04 09:37:36]

참고로. 2개 자료중 하나만 성공한 이유는 NULL 때문입니다.
NULL 은 비교 자체가 안되기 때문에 비교식에 NULL 사용시 무조건 거짓이 됩니다.

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