[DBMS_Oracle] 뷰 1

뷰 1


1. 뷰의 개념

뷰(View)는 한마디로 물리적인 테이블을 근거한 논리적인 가상 테이블이라고 정의할 수 있습니다. 

뷰를 가상 테이블이라고 하는 이유를 살펴보겠습니다. 

가상이란 단어는 실질적으로 데이터를 저장하고 있지 않기 때문에 붙인 것이고, 테이블이란 단어는 실질적으로 데이터를 저장하고 있지 않더라도 사용자는 마치 테이블을 사용하는 것과 동일하게 뷰를 사용할 수 있기 때문에 붙인 것입니다. 

뷰는 기본 테이블에서 파생된 객체로서 기본 테이블에 대한 하나의 쿼리문입니다. 

뷰(View)란 ‘보다’란 의미를 갖고 있는 점을 감안해 보면 알 수 있듯이 실제 테이블에 저장된 데이터를 뷰를 통해서 볼 수 있도록 합니다. 

사용자에게 주어진 뷰를 통해서 기본 테이블을 제한적으로 사용하게 됩니다. 


2. 뷰의 기본 테이블

뷰는 이미 존재하고 있는 테이블에 제한적으로 접근하도록 합니다. 

뷰를 생성하기 위해서는 실질적으로 데이터를 저장하고 있는 물리적인 테이블이 존재해야 하는데 이 테이블을 기본 테이블이라고 합니다. 

우선 시스템에서 제공하는 dept 테이블과 emp 테이블의 내용이 변경되는 것을 막기 위해서 테이블의 내용을 복사한 새로운 테이블을 생성한 후에 이를 기본 테이블로 사용합시다. 

뷰의 기본 테이블을 생성합시다.

1) DEPT_COPY를 DETP 테이블의 복사본으로 생성합시다.

CREATE TABLE DEPT_COPY

AS

SELECT * FROM DEPT;


2) EMP 테이블의 복사본으로 EMP_COPY를 생성합시다.

CREATE TABLE EMP_COPY

AS

SELECT * FROM EMP;


3. 뷰 정의하기

뷰를 생성하여 자주 사용되는 SELECT 문을 간단하게 접근하는 방법을 학습해 봅시다. 다음은 뷰를 생성하기 위한 기본 형식입니다. 

CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW view_name

[(alias, alias, alias, ...)]

AS subquery

[WITH CHECK OPTION]

[WITH READ ONLY];


테이블을 생성하기 위해서 CREATE TABLE 로 시작하지만, 뷰를 생성하기 위해서는 CREATE VIEW로 시작합니다. AS 다음은 마치 서브 쿼리문과 유사합니다. 

subquery에는 우리가 지금까지 사용하였던 SELECT 문을 기술하면 됩니다.


(1) 문장 해설

1) CREATE OR RELPACE VIEW

뷰를 만들 때 CREATE OR RELPACE VIEW 대신 그냥 CREATE VIEW만 사용해도 됩니다. 

그러나 그냥 CREATE VIEW를 통해 만들어진 뷰의 구조를 바꾸려면 뷰를 삭제하고 다시 만들어야 되는 반면, CREATE OR REPLACE VIEW는 새로운 뷰를 만들 수 있을 뿐만 아니라 기존에 뷰가 존재하더라도 삭제하지 않고 새로운 구조의 뷰로 변경(REPLACE)할 수 있습니다. 

그래서 대부분 뷰를 만들 때는 CREATE VIEW 대신 CREATE OR REPLACE VIEW를 사용하는 편입니다.


2) FORCE

FORCE를 사용하면, 기본 테이블의 존재 여부에 상관없이 뷰를 생성합니다. 


3) WITH CHECK OPTION

WITH CHECK OPTION을 사용하면, 해당 뷰를 통해서 볼 수 있는 범위 내에서만 UPDATE 또는 INSERT가 가능합니다.


4) WITH READ ONLY

WITH READ ONLY를 사용하면 해당 뷰를 통해서는 SELECT만 가능하며 INSERT/UPDATE/DELETE를 할 수 없게 됩니다. 

만약 이것을 생략한다면, 뷰를 사용하여 추가, 수정, 삭제(INSERT/UPDATE/DELETE)가 모두 가능합니다.


(2) 뷰 생성 예제

뷰를 만들기 전에 어떤 경우에 뷰를 사용하게 되는지 다음 예를 통해서 뷰가 필요한 이유를 설명해 보도록 하겠습니다. 

만일, 30번 부서에 소속된 사원들의 사번과 이름과 부서번호를 자주 검색한다고 한다면 다음과 같은 SELECT 문을 여러 번 입력해야 합니다. 

SELECT EMPNO, ENAME, DEPTNO

FROM EMP_COPY

WHERE DEPTNO=30;

위와 같은 결과를 출력하기위해서 매번 SELECT 문을 입력하기란 번거로운 일입니다. 

뷰는 이와 같이 번거로운 SELECT 문을 매번 입력하는 대신 보다 쉽게 원하는 결과를 얻고자 하는 바람에서 출발한 개념입니다


자주 사용되는 30번 부서에 소속된 사원들의 사번과 이름과 부서번호를 출력하기 위한 SELECT문을 하나의 뷰로 정의해 봅시다. 

CREATE VIEW EMP_VIEW30

AS 

SELECT EMPNO, ENAME, DEPTNO

FROM EMP_COPY

WHERE DEPTNO=30;


뷰는 테이블에 접근(SELECT)한 것과 동일한 방법으로 결과를 얻을 수 있습니다. 

SELECT * FROM EMP_VIEW30;


(3) 실습 [뷰를 생성할 권한이 불충분한 경우]

30번 부서에 소속된 사원들의 사번과 이름과 부서번호를 출력하기 위한 SELECT문을 하나의 뷰로 정의해 봅시다. 


1) 뷰를 생성하려는데 다음과 같이 권한이 불충분하다고 오류가 발생할 경우가 있습니다.


2) 이럴 경우에는 DBA인 SYSTEM 계정으로 로그인하여 뷰를 생성할 권한을 부여합니다. 

특정 사용자에 대해서 아무 문제없이 뷰가 생성된다면 괜찮지만, 그렇지 않을 경우 GRANT 명령어로 특정 사용자에게 권한을 부여해야 합니다. 

아래 문장은 SCOTT 사용자에게 테이블을 생성할 CREATE VIEW 권한을 부여하는 명령어입니다. 

이 명령어는 DBA 권한이 있는 사용자만이 부여할 수 있으므로 SYSTEM 계정으로 접속합니다. 

CONN system/manager

GRANT CREATE VIEW TO scott;


(4) 실습 [뷰 정의 하기]

뷰를 생성하려는데 다음과 같이 권한을 설정하였다면 30번 부서에 소속된 사원들의 사번과 이름과 부서번호를 출력하기 위한 SELECT문을 하나의 뷰로 다시 정의해 봅시다. 


1) 뷰를 정의합시다.

CREATE VIEW EMP_VIEW30

AS 

SELECT EMPNO, ENAME, DEPTNO

FROM EMP_COPY

WHERE DEPTNO=30;


2) 뷰를 생성할 때 컬럼 이름을 명시하지 않으면 뷰(EMP_VIEW30)를 정의하는 기본 테이블(EMP_COPY)의 컬럼 명을 상속받아 사용합니다. 다음은 생성된 뷰의 구조를 살펴봅시다. 

DESC EMP_VIEW30


3) 뷰의 내용을 출력해 봅시다. 테이블의 내용을 출력하는 것과 동일한 방식으로 수행하면 됩니다.  SELECT * FROM 다음에 테이블 명 대신에 뷰 이름을 기술하면 됩니다. 

SELECT * FROM EMP_VIEW30;


'Server > DBMS' 카테고리의 다른 글

[DBMS_Oracle] 뷰 3  (0) 2014.12.15
[DBMS_Oracle] 뷰 2  (0) 2014.12.15
[DBMS_MySQL] MySQL 설치 및 사용자 추가,권한  (0) 2014.12.13
[DBMS_Oracle] 인덱스  (0) 2014.12.10
[DBMS_Oracle] 시퀀스  (0) 2014.12.08