본문 바로가기

ORACLE/문제해결

두 테이블을 조인하여 만든 VIEW에 값을 추가할수 있는가?

질문---------------------------------------------------------------- 

create or replace view test
as
    select e.empno, d.deptno
    from emp e, dept d
    where e.deptno = d.deptno
    with check option

- emp테이블 + dept테이블 =>test 뷰 생성
(empno,deptno 은 각각의 테이블의 기본키) 

그리고선 

insert into test
values(1234,10)

를 실행하였더니 

"ORA-01733: 가상 열은 사용할 수 없습니다"

두 테이블을 조인하여 만든 뷰에는 값을 추가 할수 없는건가?


 


답변----------------------------------------------------------------

테스트해보니 재미있는 결과가 나오네요. 
11g 에서는 에러 안나네요.
10g 에서는 에러가 나구요.
실행계획을 비교해 봤더니
11g 에서는 fk_dept 인덱스를 이용하여
deptno가 널이 아닌 rowid 를 가져와 emp 테이블을 스캔합니다.
즉, d.deptno 를 읽지 않는 것이죠.
아마 실행쿼리가 변형되어 d.deptno 가 e.deptno 로 봐뀌었을 듯 하네요.
혹시나 해서 fk_deptno 인덱스를 삭제하고 했더니.
그냥 emp 풀스캔 하네요. 역시나 dept 테이블은 읽지 않습니다.
결론은 d.deptno 가 e.deptno 로 바뀌어
두개 컬럼이 모두 emp의 컬럼이 되며 Insert 를 수행하면 문제 없이 emp로 입력됩니다.
그러나 10g의 실행계획을 확인해 보면
dept 테이블이나 인덱스를 읽어 emp 와 조인합니다.
즉, d.deptno 는 dept의 컬럼이고 e.empno 는 emp 의 컬럼인거죠.
쿼리 변형이 읽어나지 않았습니다.
두개 컬럼이 서로 다른 테이블을 바라보고 잇어서 입력이 안됩니다.
쿼리를 d.deptno 대신 e.deptno 로 바꾸시면 입력됩니다. 

출처 : 
http://oracleclub.com/article/55478
 


결론---------------------------------------------------------------- 
10g에서 서로 다른 테이블의 칼럼을 조인하여 만든 뷰의 경우 데이터의 추가는 제한적이다.



 

'ORACLE > 문제해결' 카테고리의 다른 글

ORA-24324, ORA-24323, ORA-01090 문제해결  (0) 2012.04.07
ORA-12560 에러 해결방법  (0) 2012.03.28
ORA-14551 에러 해결방법  (0) 2012.03.18
ORA-12514 에러 해결방법 (윈도우)  (2) 2012.03.17
유저 비밀번호 변경시  (0) 2012.03.14