가상 테이블 뷰 View
물리적인 테이블을 근거한 논리적인 가상 테이블. 이 물리적인 테이블을 기본 테이블이라고 한다.
뷰는 이 기본 테이블에서 파생된 객체로, 하나의 쿼리문이라고 할 수 있겠다.
실질적으로 데이터를 저장하고 있지 않지만 이 데이터를 뷰를 통하여 볼 수 있다.
사용자는 각각에게 주어진 뷰를 통해 기본 테이블을 제한적으로 사용하게 된다.
서브 쿼리 형태로 만들어진 뷰인 인라인 뷰를 주로 사용하게 된다.
뷰 생성 실습을 위해 emp, dept 테이블을 복사하여 emp_copy, dept_copy 테이블을 생성했다.
그러나 문제가 있다. 실습을 위해 사용중인 scott 계정은 뷰를 만들 수 있는 권한이 없다.
system 계정으로 로그인, 새 워크시트를 열어 DCL Grant로
scott 계정에게 create view 권한을 부여한다.
grant create view to scott;
다시 scott 계정으로 들어가 아까의 create view SQL문을 실행하면 이번에는 잘 생성된다.
생성된 뷰 간단히 확인
select*from tab;
생성된 뷰의 상세 정보 확인
select*from user_views;
일반 테이블처럼 검색할 수도 있다.
이 가상테이블 view_30에 insert 명령문으로 새로운 데이터를 삽입하면
기본 테이블 emp_copy에도 영향을 미친다.
emp_view30을 조회하면 삽입된 데이터가 나온다.
emp_copy를 조회해보면 가장 마지막에 삽입된 새 데이터를 확인할 수 있다.
뷰에 데이터를 삽입하면, 기본 테이블에도 영향을 미친다고 볼 수 있다.
뷰 생성
create view 뷰이름 as select 컬럼1, 컬럼2, 컬럼3 from 기본테이블 where 조건;
뷰 삭제
drop view 뷰이름;
뷰의 종류
위에서 실습한 뷰는 단순 뷰에 속한다.
단순 뷰 (Simple View) |
복합 뷰 (Complex View) |
하나의 기본 테이블로 생성 | 여러 개의 기본 테이블로 생성 |
그룹 함수의 사용이 불가능 | 그룹 함수의 사용이 가능 |
DISTINCT 사용이 불가능 | DISTINCT 사용이 가능 |
DML 사용 가능 | DML 사용 불가능 |
뷰 생성의 옵션
1. or replace
뷰를 생성하려고 하는데, 동일한 이름을 가진 뷰가 이미 존재한다면,
새로운 뷰를 생성하지 않고 기존의 뷰에 내용을 업데이트 한다.
그러나 신규 생성이라면, 뷰가 생성된다.
create or replace 뷰이름 as select 컬럼1, 컬럼2 from 기본테이블 where 조건;
(1) or replace 없이 동일한 뷰 생성 실습 결과
(2) or replace 옵션으로 동일한 뷰 생성 실습 결과
2. with check option
where 조건절에 사용된 값을 수정하지 못하게 한다.
(중략)... where 조건절 with check option;
(1) with check option 없는 뷰 실습 결과
만약 여러명의 사용자가 공유하는 뷰의 조건을 이렇게 마음대로 바꿔버리면 혼란을 초래할 수 있다.
(2) with check option 를 넣은 뷰 생성 실습 결과
뷰를 새로 생성해보았다.
급여가 1200 이상인 사원들의 부서번호를 30번에서 20번으로 변경하는 update 문을 작성해 수정을 시도해본다.
그러나 수정할 수 없다.
3. with read only
뷰를 통해 기본 테이블을 수정할 수 없도록 한다.
즉, 읽기 전용 뷰가 된다.
(중략)... where 조건절 with read only;
(1) with read only 를 넣은 뷰 생성 실습 결과
이 뷰의 내용은 다음과 같다.
이 뷰의 내용을 모든 사원의 급여가 3000을 받도록 수정해 보았다.
그러나 수정되지 않는다.
'오라클 데이터베이스' 카테고리의 다른 글
인덱스 Index (0) | 2022.07.29 |
---|---|
시퀀스 Sequence (0) | 2022.07.29 |
무결성 제약 조건 (0) | 2022.07.27 |
DQL> Select - 서브 쿼리 (0) | 2022.07.27 |
DQL> Select - ANSI Join (Cross, Inner, Natural, Outer) (0) | 2022.07.25 |