안녕하세요 view 테이블 관련 update 질문드립니다. 0 4 1,659

by 오류가 낙타낳다 [Oracle 기초] [2017.02.22 11:44:10]


--뷰 테이블 생성

create or replace view view_notInline
  as select * from employees
  where department_id=100;

-- department_id가100인 사람 6명
 select * from view_notinline;

--department_id가 100인 사람의 salary가1200 이상인 사람들의 department_id를 50으로 변경

--department_id가 100인 사람은 모두 salary가1200이사이여서 모두 id가 50으로 변경

update view_notinline set department_id= 50 where salary>=1200;

 

--update후에 department_id가 100인 사람0명

select * from view_notinline;

 

그런데 문제는 여기서부터입니다

select * from employees

where department_id=100;

일때 department_id 100값은 50으로 변경되어서 100의 값은 나오지않습니다

 

질문입니다..

view테이블은 보여주는 테이블로만 알고있는데 왜 employees 테이블의 값까지 변경을 해주는걸까요?

by jkson [2017.02.22 11:54:40]

보여주기만 하는 게 아니라 그런겁니다.

뷰 문법 확인하시구요.

http://www.gurubee.net/lecture/1036

with read only 옵션을 안 주면 update 가능한 조건을 지켜주면 update도 가능합니다.


by 오류가 낙타낳다 [2017.02.22 12:09:04]

답변감사드립니다

해당 url에서는 뷰 테이블이 가상테이블이라고하시는데

궁극적인 질문은

왜 가상테이블을 변경했는데 employees테이블까지 변경이되는지 궁금합니다.

가상테이블을 변경하면 가상테이블만 변경되는게 아닌가요??

 

교육받을 때는 가상테이블이라고 교육을 받았는데 실무에서 쓸 때는 여과해주는,필더링 테이블을 목적으로 배웠습니다..


by jkson [2017.02.22 12:30:25]

가상 테이블이라고 하신 게 아니고 '가상 테이블이라 생각하면 된다' 라고 하셨죠.

일반적인 뷰는 미리 정의된 쿼리라 생각하시면 됩니다.

a테이블과 b테이블이 항상 조인형태로만 사용된다면 이러한 쿼리를 c라는 뷰로 만들어놓으면

개발할 때 a, b 테이블을 굳이 조인하는 쿼리를 만들지 않고 c 뷰를 사용하면 되니까

개발 속도도 높아질 거구요.

업무를 잘 아는 개발자가 뷰를 미리 만들어놓으면 그 업무를 잘 모르는 개발자가 개발할 때

굳이 이 테이블 저 테이블 조인하지 않고도 뷰만 사용하면 되니 편하겠죠.

뷰를 만들어놓고 특정 사용자에게 특정 뷰만 조회할 수 있게하면 보안상으로도 유리해질 수 있겠구요.

결론적으로 뷰는 미리 정의된 쿼리이고 직접적으로 원본 테이블을 액세스하게 되므로

UPDATE할 수 있는 조건이 갖추어지면 UPDATE도 가능합니다.


by 오류가 낙타낳다 [2017.02.22 15:08:58]

아 감사합니다 교육받을 때도 "가상테이블이라고 생각하면되"를 정말로 가상테이블이라고 생각하고있었습니다..

뷰의 정의와 목적도 같이 설명해주셔서 감사드립니다

잘못된 생각으로 인해서 더 좋은 정보를 얻고가네요 ㅎㅎ

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