☭DEVELOPER/#2 웹개발(자바기반 풀스택)

[BACKEND] 뷰(View)

조반짝 2023. 9. 7. 16:33
728x90
반응형

※ 뷰(View)

1. 뷰의 개념과 뷰 사용하기
물리적인 테이블에 근거한 논리적인 가상 테이블인 뷰(View) 객체를 생성하고
제거하거나 변경하는 방법에 대해 학습 합니다.
기본 테이블의 수에 따라 뷰는 단순 뷰(Simple View)와 복합뷰(Complex View)로
나누어집니다.

뷰(View)는 하나 이상의 테이블이나 다른 뷰를 이용하여 생성되는
가상 테이블(virtual table)을 말합니다.

우리가 알고 있는 테이블은 디스크에 공간이 할당되어 데이터를 저장하고 있지만
뷰는 디스크 저장 공간이 할당되지 않습니다. 즉,실질적으로 데이터를 저장하지 않고
데이터 사전에 뷰를 정의할 때 기술한 쿼리문만 저장되어 있습니다. 하지만 사용 방법은
테이블에서 파생된 객체 테이블과 유사하기 때문에 ‘가상 테이블’이라고 합니다.

뷰는 테이블에서 파생된 객체로서 뷰를 정의하기 위해서 사용된 테이블을 '기본 테이블'
이라고 합니다. 뷰는 별도의 기억 공간이 존재하지 않기 때문에 뷰에 대한 수정 결과는
뷰를 정의한 기본 테이블에 적용됩니다. 반대로 기본 테이블의 데이터가 변경되어도
뷰에 반영됩니다. 뷰를 정의한 기본 테이블의 무결성 제약 조건 역시 상속됩니다.
뷰의 정의는 USER_VIEWS 데이터 사전을 통해 조회가 가능합니다.

1) 뷰 생성
뷰는 CREATE VIEW 명령문을 사용하여 생성합니다. 다음은 뷰를 생성하기 위한
형식입니다.
(형식)
CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW viewname
[(alias, alias, … )...]
AS subquery

뷰 이름(viewname)은 반드시 식별자에 적용되는 규칙을 준수해서 명명합니다.
뷰의 칼럼명을 기본 테이블의 칼럼명과 다르게 지정할 경우에 사용합니다.
뷰를 생성할 때 칼럼을 명시하지 않으면 서브 쿼리문에 기술한 기본 테이블의
칼럼명을 상속받게 됩니다. 칼럼이 산술식, 함수 또는 상수에서 파생된 경우,
일반적으로 조인 때문에 둘 이상의 칼럼이 같은 이름을 갖는 경우, 뷰의 칼럼이
파생된 칼럼과 다른 이름을 갖는 경우에는 칼럼명을 명시해야 합니다.

2) 뷰의 종류

뷰는 단순 뷰(Simple View)와 복합 뷰(Complex View)로 나뉘는데
이는 뷰를 정의하기 위해서 사용되는 기본 테이블의 수에 따른 것입니다.

단순 뷰(simple view)는 하나의 기본 테이블로 생성한 뷰이며,
DML 명령문을 실행할 수 있습니다. DML 명령문의 처리 결과는
기본 테이블에 반영됩니다.

복합 뷰(complex view)는 두 개 이상의 기본 테이블로 생성한 뷰입니다.
무결성 제약 조건, 표현식, GROUP BY 절의 유무에 따라 DML 명령문을
제한적으로 사용합니다. 복합뷰는 DISTINCT, 그룹함수, GROUP BY,
ROWNUM을 포함할 수 없습니다.

3) 뷰의 필요성
뷰를 사용하는 이유는 보안과 사용의 편의성 때문입니다.
전체 데이터가 아닌 일부만 접근할 수 있도록 뷰를 정의하면
일반 사용자에게 해당 뷰만 접근 가능하도록 허용하여 중요한
데이터가 외부에 공개되는 것을 막을 수 있습니다.
사원 테이블의 급여나 커미션은 개인적인 정보이므로
다른 사원들의 접근을 제한해야 합니다.

정보 접근을 편리하게 하기 위해서 뷰를 통해 사용자에게 필요한 정보만
선택적으로 제공합니다.

4. 뷰의 처리 과정
뷰는 데이터를 저장하고 있지 않은 가상 테이블이므로 실체가 없습니다.
뷰가 테이블처럼 사용될 수 있는 이유는 뷰를 정의할 때 CREATE VIEW 명령어 다음의
AS 절에 기술한 쿼리 문장 자체를 저장하고 있다가 이를 실행하기 때문입니다.

오라클에서는 USER_VIEWS 데이터 사전에 사용자가 생성한 모든 뷰에 대한 정의를
저장하고 있습니다.

뷰는 일종의 SELECT 문에 이름을 붙인 것입니다.
뷰에 대한 질의가 내부적으로 처리되는 과정은 다음과 같습니다.
[다음]
① USER_VIEW 데이터 사전에서 뷰에 대한 정의를 조회합니다.
② 기본 테이블에 대한 뷰의 접근 권한을 살핍니다.
③ 뷰에 대한 질의를 기본 테이블에 대한 질의로 변환합니다.
④ 기본 테이블에 대한 질의를 통해 데이터를 검색합니다.
⑤ 검색된 결과를 출력합니다.

뷰에 대해서 질의를 하면 오라클 서버는 USER_VIEWS에서 뷰를 찾아
이를 정의할 때 기술한 서브 쿼리문을 뷰 위치로 가져갑니다.

뷰는 SELECT 문으로 기본 테이블의 내용을 조회할 수 있을 뿐만 아니라
DML(INSERT, DELETE, UPDATE) 문으로 기본 테이블의 내용을 변경할 수 있습니다.

5) 다양한 뷰
함수를 사용하여 뷰를 생성할 수 있습니다. 각 부서별 급여 총액과 평균을 구하는
뷰를 작성하기 위해서는 SUM과 AVG 함수를 사용해야 합니다. 이 때 주의할 점은
그룹함수는 물리적인 칼럼이 존재하지 않고 결과를 가상 칼럼처럼 사용합니다.
가상 칼럼은 기본 테이블에서 칼럼명을 상속받을 수 없기 때문에 반드시
칼럼 별칭을 명시해야 합니다.

그룹함수를 사용한 뷰를 사용할 때에는 칼럼 별칭을 주어야 합니다.
만약, 그룹함수에 대해 칼럼 별칭을 설정하지 않으면 오류가 발생합니다.
아울러, 그룹함수를 가상 칼럼으로 갖는 뷰에 대해서 DML 문을 사용할 수 없슬니다.

6) 뷰 제거하기
뷰는 실체가 없는 가상 테이블이기 때문에 뷰를 제거한다는 것은
USER_VIEWS 데이터 사전에 뷰의 정의를 제거하는 것을 의미합니다.
뷰를 제거해도 뷰를 정의한 기본 테이블의 구조나 데이터에는
전혀 영향을 주지 않습니다.

[뷰 제거 요점 정리]
1) 실체가 없는 가상 테이블인 뷰(VIEW) 제거
2) 뷰 제거 의미는 USER_VIEWS 데이터 사전에서 뷰(VIEW) 정의 제거를 의미함
3) 그러므로, 뷰 제거해도 뷰 정의한 기본 테이블 구조나 데이터에는 영향을 주지 않음

2. 다양한 뷰 옵션
뷰의 형식을 살펴보면 다양한 옵션을 지정할 수 있음을 알 수 있습니다.
(형식)
CREATE [OR REPLACE] [FORCE I NOFORCE] view_name
[(alias, alias, alias, ...)]
AS subquery
[WITH CHECK OPTION]
[WITH READ ONLY];

1) OR REPLACE
OR REPLACE 옵션은 이미 존재하는 뷰에 대해서 그 내용을 새롭게 변경하여
재 생성합니다. 존재하지 않는 뷰라면 뷰를 새롭게 생성합니다. 뷰를 정의할 때
일반적으로 CREATE VIEW 보다는 CREATE OR REPLACE VIEW를 사용하여
융통성 있게 뷰를 생성합니다.

지금까지 사용한 CREATE VIEW 명령문은 뷰를 새롭게 생성할 때만 해야 합니다.
뷰가 이미 존재하는데 CREATE VIEW 명령어를 사용하면 오류 메시치가 출력됩니다.

CREATE OR REPLACE VIEW를 사용하면 존재하지 않은 뷰를 새롭게 생성하고
기존의 뷰에 대해서는 그 내용을 변경합니다.

2) FORCE
FORCE 옵션은 기본 테이블의 존재 유무에 상관없이 뷰를 생성해야 할 경우에
사용하며, NOFORCE 옵션은 반드시 기존 테이블이 존재할 경우에만 뷰를 생성합니다.
FORCE, NOFORCE 옵션 중 하나를 지정해야 하는데 특별한 설정이 없으면
NOFORCE 옵션이 지정된 것으로 간주합니다.

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

뷰를 정의하는 서브 쿼리문에 WHERE 절을 추가하여 기본 테이블 중 특정 조건에
만족하는 로우(행)만으로 구성된 뷰를 생성할 수 있습니다.

뷰를 생성할 때 WHERE 절을 추가하여 기본 테이블에서 정보가 추출되는 조건을
제시하면서 연속적으로 WITH CHECK OPTION을 기술하면 조건 제시를 위해 사용한
칼럼 값이 아닌 값에 대해서는 뷰를 통해서 추가 혹은 변경되지 못하도록 합니다.

4) WITH READ ONLY
WITH READ ONLY를 사용하면 해당 뷰를 통해서는 SELECT만 가능하며,
INSERT/UPDATE/DELETE를 할 수 없게 됩니다. WITH READ ONLY 옵션을
지정하지 않은 뷰는 추가(INSERT), 수정(UPDATE), 삭제(DELETE)가 모두 가능합니다.

 

기본 형식
UPDATE [테이블] SET [열] = '변경할 값' WHERE [조건]



VIEW: 데이터베이스에 있는 내용을 조회만 가능한 가상의 테이블

 

추후 실무 시 협력업체 일도 함. 

협력업체에 대한 외주업체 매출 판매 데이터를 교류 및 정보 공유를 한다. 

정보 공유 시에 가상테이블인 VIEW를 사용 하도록한다.

정보 보안을 위해 조회만 가능한 용도

 


--단순 뷰 생성하기

SQL> --단순 뷰 생성하기
SQL> CREATE VIEW V_EMP_JOB(사번, 사원이름, 부서번호, 담당업무)
  2  AS
  3  SELECT ENO, ENAME, DNO, JOB
  4  FROM EMPLOYEE
  5  WHERE JOB LIKE 'SALESMAN';

뷰가 생성되었습니다.

EMPLOYEE의 JOB 중에서 'SALESMAN'; 에 대한 뷰를 생성

like = '='

WHERE JOB = 'SALESMAN'이랑 같은 의미

SQL> select * from v_emp_job;

      사번 사원이름     부서번호 담당업무
---------- ---------- ---------- ---------
      7499 ALLEN              30 SALESMAN
      7521 WARD               30 SALESMAN
      7654 MARTIN             30 SALESMAN
      7844 TURNER             30 SALESMAN

칼럼명을 지정안하면 

뷰를 생성할 때 칼럼명을 생략하면 기본 테이블의 칼럼며을 상속 받아서 표현합니다.

SQL> -- 부를 생성할 때 ㅋ칼럼명을 생략하면 기본 테이블의 칼럼며을 상속 받아서 표현합니다.
SQL> create view v_emp_job2
  2  as
  3  select eno, ename, dno, job
  4  from employee
  5  where job like 'SALESMAN';

뷰가 생성되었습니다.

복합 뷰 정의하기

SQL> -- 복합 뷰 정의하기
SQL> CREATE VIEW V_EMP_COMPLEX
  2  as
  3  SELECT *
  4  FROM EMPLOYEE NATURAL JOIN DEPARTMENT;

뷰가 생성되었습니다.
SQL> SELECT * FROM V_EMP_COMPLEX;

       DNO        ENO ENAME      JOB          MANAGER HIREDATE     SALARY
---------- ---------- ---------- --------- ---------- -------- ----------
COMMISSION DNAME          LOC
---------- -------------- -------------
        20       7369 SMITH      CLERK           7902 80/12/17        800
           RESEARCH       DALLAS

        30       7499 ALLEN      SALESMAN        7698 81/02/20       1600
       300 SALES          CHICAGO

        30       7521 WARD       SALESMAN        7698 81/02/22       1250
       500 SALES          CHICAGO


       DNO        ENO ENAME      JOB          MANAGER HIREDATE     SALARY
---------- ---------- ---------- --------- ---------- -------- ----------
COMMISSION DNAME          LOC
---------- -------------- -------------
        20       7566 JONES      MANAGER         7839 81/04/02       2975
           RESEARCH       DALLAS

        30       7654 MARTIN     SALESMAN        7698 81/09/28       1250
      1400 SALES          CHICAGO

        30       7698 BLAKE      MANAGER         7839 81/05/01       2850
           SALES          CHICAGO


       DNO        ENO ENAME      JOB          MANAGER HIREDATE     SALARY
---------- ---------- ---------- --------- ---------- -------- ----------
COMMISSION DNAME          LOC
---------- -------------- -------------
        10       7782 CLARK      MANAGER         7839 81/06/09       2450
           ACCOUNTING     NEW YORK

        20       7788 SCOTT      ANALYST         7566 87/07/13       3000
           RESEARCH       DALLAS

        10       7839 KING       PRESIDENT            81/11/17       5000
           ACCOUNTING     NEW YORK


       DNO        ENO ENAME      JOB          MANAGER HIREDATE     SALARY
---------- ---------- ---------- --------- ---------- -------- ----------
COMMISSION DNAME          LOC
---------- -------------- -------------
        30       7844 TURNER     SALESMAN        7698 81/09/08       1500
         0 SALES          CHICAGO

        20       7876 ADAMS      CLERK           7788 87/07/13       1100
           RESEARCH       DALLAS

        30       7900 JAMES      CLERK           7698 81/12/03        950
           SALES          CHICAGO


       DNO        ENO ENAME      JOB          MANAGER HIREDATE     SALARY
---------- ---------- ---------- --------- ---------- -------- ----------
COMMISSION DNAME          LOC
---------- -------------- -------------
        20       7902 FORD       ANALYST         7566 81/12/03       3000
           RESEARCH       DALLAS

        10       7934 MILLER     CLERK           7782 82/01/23       1300
           ACCOUNTING     NEW YORK


14 개의 행이 선택되었습니다.

SQL> SET LINESIZE 200
SQL> SETPAGESIZE 50

표 크기 조정

SELECT * FROM V_EMP_COMPLEX;

SQL> SELECT * FROM V_EMP_COMPLEX
  2  ;

       DNO        ENO ENAME      JOB          MANAGER HIREDATE     SALARY COMMISSION DNAME          LOC
---------- ---------- ---------- --------- ---------- -------- ---------- ---------- -------------- -------------
        20       7369 SMITH      CLERK           7902 80/12/17        800            RESEARCH       DALLAS
        30       7499 ALLEN      SALESMAN        7698 81/02/20       1600        300 SALES          CHICAGO
        30       7521 WARD       SALESMAN        7698 81/02/22       1250        500 SALES          CHICAGO
        20       7566 JONES      MANAGER         7839 81/04/02       2975            RESEARCH       DALLAS
        30       7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400 SALES          CHICAGO
        30       7698 BLAKE      MANAGER         7839 81/05/01       2850            SALES          CHICAGO
        10       7782 CLARK      MANAGER         7839 81/06/09       2450            ACCOUNTING     NEW YORK
        20       7788 SCOTT      ANALYST         7566 87/07/13       3000            RESEARCH       DALLAS
        10       7839 KING       PRESIDENT            81/11/17       5000            ACCOUNTING     NEW YORK
        30       7844 TURNER     SALESMAN        7698 81/09/08       1500          0 SALES          CHICAGO
        20       7876 ADAMS      CLERK           7788 87/07/13       1100            RESEARCH       DALLAS

       DNO        ENO ENAME      JOB          MANAGER HIREDATE     SALARY COMMISSION DNAME          LOC
---------- ---------- ---------- --------- ---------- -------- ---------- ---------- -------------- -------------
        30       7900 JAMES      CLERK           7698 81/12/03        950            SALES          CHICAGO
        20       7902 FORD       ANALYST         7566 81/12/03       3000            RESEARCH       DALLAS
        10       7934 MILLER     CLERK           7782 82/01/23       1300            ACCOUNTING     NEW YORK

14 개의 행이 선택되었습니다.
NATURAL JOIN : WHERE 절을 사용하지 않고 NATURAL JOIN 키워드를 사용하면 오라클에서 자동적으로 테이블의 모든 칼럼을 대상으로 일치하는 데이터 유형 및 이름을 가진 공통 칼럼을 조사한 후에 자동으로 조인을 수행합니다.

 

사원테이블에서 급여와 커미션 칼럼을 제외한 나머지 칼럼으로 구성된 뷰생성

SQL> -- 사원테이블에서 급여와 커미션 칼럼을 제외한 나머지 칼럼으로 구성된 뷰생성
SQL> CREATE VIEW V_EMP_SAMPLE
  2  AS
  3  SELECT ENO, ENAME, JOB, MANAGER, DNO
  4  FROM EMPLOYEE;

뷰가 생성되었습니다.
SQL> SELECT * FROM V_EMP_SAMPLE;

       ENO ENAME      JOB          MANAGER        DNO
---------- ---------- --------- ---------- ----------
      7369 SMITH      CLERK           7902         20
      7499 ALLEN      SALESMAN        7698         30
      7521 WARD       SALESMAN        7698         30
      7566 JONES      MANAGER         7839         20
      7654 MARTIN     SALESMAN        7698         30
      7698 BLAKE      MANAGER         7839         30
      7782 CLARK      MANAGER         7839         10
      7788 SCOTT      ANALYST         7566         20
      7839 KING       PRESIDENT                    10
      7844 TURNER     SALESMAN        7698         30
      7876 ADAMS      CLERK           7788         20

       ENO ENAME      JOB          MANAGER        DNO
---------- ---------- --------- ---------- ----------
      7900 JAMES      CLERK           7698         30
      7902 FORD       ANALYST         7566         20
      7934 MILLER     CLERK           7782         10

14 개의 행이 선택되었습니다.

NATURAL JOIN 활용 DNO 칼럼을 공통으로 정보 제공을위한 뷰 활용

SQL> -- NATURAL JOIN 활용 DNO 칼럼을 공통으로 정보 제공을위한 뷰 활용
SQL> CREATE VIEW V_EMP_COMPLEX2
  2  AS
  3  SELECT E.ENO, E.ENAME, E.SALARY, DNO, D.DNAME, D.LOC
  4  FROM EMPLOYEE E NATURAL JOIN DEPARTMENT D;

뷰가 생성되었습니다.
SQL> SELECT * FROM V_EMP_COMPLEX2;

       ENO ENAME          SALARY        DNO DNAME          LOC
---------- ---------- ---------- ---------- -------------- -------------
      7369 SMITH             800         20 RESEARCH       DALLAS
      7499 ALLEN            1600         30 SALES          CHICAGO
      7521 WARD             1250         30 SALES          CHICAGO
      7566 JONES            2975         20 RESEARCH       DALLAS
      7654 MARTIN           1250         30 SALES          CHICAGO
      7698 BLAKE            2850         30 SALES          CHICAGO
      7782 CLARK            2450         10 ACCOUNTING     NEW YORK
      7788 SCOTT            3000         20 RESEARCH       DALLAS
      7839 KING             5000         10 ACCOUNTING     NEW YORK
      7844 TURNER           1500         30 SALES          CHICAGO
      7876 ADAMS            1100         20 RESEARCH       DALLAS

       ENO ENAME          SALARY        DNO DNAME          LOC
---------- ---------- ---------- ---------- -------------- -------------
      7900 JAMES             950         30 SALES          CHICAGO
      7902 FORD             3000         20 RESEARCH       DALLAS
      7934 MILLER           1300         10 ACCOUNTING     NEW YORK

14 개의 행이 선택되었습니다.

USER_VIEWS 데이터 사전을 활용한 VIEW_NAME, TEXT 정보 보기

SQL> -- USER_VIEWS 데이터 사전을 활용한 VIEW_NAME, TEXT 정보 보기
SQL> SELECT VIEW_NAME, TEXT FROM USER_VIEWS;

VIEW_NAME                      TEXT
------------------------------ --------------------------------------------------------------------------------
EMP_DETAILS_VIEW               SELECT
                                 e.employee_id,
                                 e.job_id,
                                 e.manager_id,
                                 e.department_id,
                                 d.locat

V_EMP_COMPLEX                  SELECT "DNO","ENO","ENAME","JOB","MANAGER","HIREDATE","SALARY","COMMISSION","DNA
V_EMP_COMPLEX2                 SELECT E.ENO, E.ENAME, E.SALARY, DNO, D.DNAME, D.LOC
                               FROM EMPLOYEE E NATURAL JOI


VIEW_NAME                      TEXT
------------------------------ --------------------------------------------------------------------------------
V_EMP_JOB                      SELECT ENO, ENAME, DNO, JOB
                               FROM EMPLOYEE
                               WHERE JOB LIKE 'SALESMAN'

V_EMP_JOB2                     select eno, ename, dno, job
                               from employee
                               where job like 'SALESMAN'

V_EMP_SAMPLE                   SELECT ENO, ENAME, JOB, MANAGER, DNO
                               FROM EMPLOYEE


6 개의 행이 선택되었습니다.

뷰를 통해 기본 테이블에 데이터 추가하기

SQL> -- 뷰를 통해 기본 테이블에 데이터 추가하기
SQL> INSERT INTO V_EMP_JOB
  2  VALUES(3000, '김희선', 30, 'SALESMAN');

1 개의 행이 만들어졌습니다.

SQL> SELECT * FROM V_EMP_JOB;

      사번 사원이름     부서번호 담당업무
---------- ---------- ---------- ---------
      3000 김희선             30 SALESMAN
      7499 ALLEN              30 SALESMAN
      7521 WARD               30 SALESMAN
      7654 MARTIN             30 SALESMAN
      7844 TURNER             30 SALESMAN

가상테이블은 기본테이블을 근간으로 한다.

SQL> SELECT * FROM EMPLOYEE;

       ENO ENAME      JOB          MANAGER HIREDATE     SALARY COMMISSION        DNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      3000 김희선     SALESMAN                                                    30
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7782 CLARK      MANAGER         7839 81/06/09       2450                    10
      7788 SCOTT      ANALYST         7566 87/07/13       3000                    20
      7839 KING       PRESIDENT            81/11/17       5000                    10
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0         30

       ENO ENAME      JOB          MANAGER HIREDATE     SALARY COMMISSION        DNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7876 ADAMS      CLERK           7788 87/07/13       1100                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7902 FORD       ANALYST         7566 81/12/03       3000                    20
      7934 MILLER     CLERK           7782 82/01/23       1300                    10

15 개의 행이 선택되었습니다.

뷰에 그룹함수 사용하기(별칭사용)

SQL> -- 뷰에 그룹함수 사용하기(별칭사용)
SQL> CREATE VIEW V_EMP_SALARY
  2  AS
  3  SELECT DNO, SUM(SALARY) AS "봉급 합계", AVG(SALARY) AS "봉급평균"
  4  FROM EMPLOYEE
  5  GROUP BY DNO;

뷰가 생성되었습니다.
SQL> SELECT * FROM V_EMP_SALARY;

       DNO  봉급 합계   봉급평균
---------- ---------- ----------
        30       9400 1566.66667
        20      10875       2175
        10       8750 2916.66667

그룹함수(GROUP BY)를 사용한 뷰를 사용할 때에는 칼럼 별칭을 주어야 합니다.

그룹함수(GROUP BY)를 가상 칼럼으로 갖고있는 뷰에 대해서는 DML문을 사용할 수 없습니다.

그룹함수(GROUP BY)를 가상 칼럼으로 갖고있는 뷰에 데이터 추가 에러 확인하기

SQL> -- 그룹함수(GROUP BY)를 사용한 뷰를 사용할 때에는 칼럼 별칭을 주어야 합니다.
SQL> -- 그룹함수(GROUP BY)를 가상 칼럼으로 갖고있는 뷰에 대해서는
SQL> -- DML문을 사용할 수 없습니다.
SQL> -- 그룹함수(GROUP BY)를 가상 칼럼으로 갖고있는 뷰에 데이터 추가 에러 확인하기
SQL> INSERT INTO V_EMP_SALARY VALUES(80, 1000, 3000);
INSERT INTO V_EMP_SALARY VALUES(80, 1000, 3000)
*
1행에 오류:
ORA-01733: 가상 열은 사용할 수 없습니다

뷰 제거하기

뷰가 삭제되었습니다.

SQL> SELECT VIEW_NAME, TEXT FROM USER_VIEWS;

VIEW_NAME                      TEXT
------------------------------ --------------------------------------------------------------------------------
EMP_DETAILS_VIEW               SELECT
                                 e.employee_id,
                                 e.job_id,
                                 e.manager_id,
                                 e.department_id,
                                 d.locat

V_EMP_COMPLEX                  SELECT "DNO","ENO","ENAME","JOB","MANAGER","HIREDATE","SALARY","COMMISSION","DNA
V_EMP_COMPLEX2                 SELECT E.ENO, E.ENAME, E.SALARY, DNO, D.DNAME, D.LOC
                               FROM EMPLOYEE E NATURAL JOI


VIEW_NAME                      TEXT
------------------------------ --------------------------------------------------------------------------------
V_EMP_JOB                      SELECT ENO, ENAME, DNO, JOB
                               FROM EMPLOYEE
                               WHERE JOB LIKE 'SALESMAN'

V_EMP_SALARY                   SELECT DNO, SUM(SALARY) AS "봉급 합계", AVG(SALARY) AS "봉급평균"
                               FROM EMPLOYEE

V_EMP_SAMPLE                   SELECT ENO, ENAME, JOB, MANAGER, DNO
                               FROM EMPLOYEE


6 개의 행이 선택되었습니다.

CREATE VIEW : 존재하지 않는 뷰를 새롭게 생성할 때 사용합니다.

CREATE OR REPLACE : 존재하지 않는 뷰를 새롭게 생성하는 것도 되고 기존의 뷰에 대한 내용 변경도 가능합니다.

                                          일반적으로 많이 사용합니다.

 

 

뷰내용 생성(또는 변경)하기

SQL> -- 뷰내용 생성(또는 변경)하기
SQL> CREATE OR REPLACE VIEW V_EMP_JOB2
  2  AS
  3  SELECT ENO, ENAME, DNO, JOB
  4  FROM EMPLOYEE
  5  WHERE JOB LIKE 'MANAGER';

뷰가 생성되었습니다.

SQL> SELECT * FROM V_EMP_JOB2;

       ENO ENAME             DNO JOB
---------- ---------- ---------- ---------
      7566 JONES              20 MANAGER
      7698 BLAKE              30 MANAGER
      7782 CLARK              10 MANAGER

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

담당 업무가 MANAGER인 사원들을 조회하는 뷰 생성하기

SQL> CREATE OR REPLACE VIEW V_EMP_JOB_NOCHK
  2  AS
  3  SELECT ENO, ENAME, DNO, JOB
  4  FROM EMPLOYEE
  5  WHERE JOB LIKE 'MANAGER';

뷰가 생성되었습니다.

SQL> SELECT * FROM V_EMP_JOB_KNOCHK;
SELECT * FROM V_EMP_JOB_KNOCHK
              *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다


SQL> SELECT * FROM V_EMP_JOB_NOCHK;

       ENO ENAME             DNO JOB
---------- ---------- ---------- ---------
      7566 JONES              20 MANAGER
      7698 BLAKE              30 MANAGER
      7782 CLARK              10 MANAGER

위에서 생성한 V_EMP_JOB_NOCHK 뷰에 사원을 추가하는데 이때, 담당업무를 SALESMAN으로 지정해서 추가해봅니다.

SQL> -- 위에서 생성한 V_EMP_JOB_NOCHK 뷰에 사원을 추가하는데
SQL> -- 이때, 담당업무를 SALESMAN으로 지정해서 추가해봅니다.
SQL> INSERT INTO V_EMP_JOB_NOCHK
  2  VALUES(9000, '김다미', 30, 'SALESMAN');

1 개의 행이 만들어졌습니다.

SQL> SELECT * FROM V_EMP_JOB_NOCHK;

       ENO ENAME             DNO JOB
---------- ---------- ---------- ---------
      7566 JONES              20 MANAGER
      7698 BLAKE              30 MANAGER
      7782 CLARK              10 MANAGER

SALESMAN이 안보인다.

SQL> SELECT * FROM EMPLOYEE;

       ENO ENAME      JOB          MANAGER HIREDATE     SALARY COMMISSION        DNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      3000 김희선     SALESMAN                                                    30
      9000 김다미     SALESMAN                                                    30
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7782 CLARK      MANAGER         7839 81/06/09       2450                    10
      7788 SCOTT      ANALYST         7566 87/07/13       3000                    20
      7839 KING       PRESIDENT            81/11/17       5000                    10

       ENO ENAME      JOB          MANAGER HIREDATE     SALARY COMMISSION        DNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0         30
      7876 ADAMS      CLERK           7788 87/07/13       1100                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7902 FORD       ANALYST         7566 81/12/03       3000                    20
      7934 MILLER     CLERK           7782 82/01/23       1300                    10

16 개의 행이 선택되었습니다.

아까는 위에 것이 처리가 됐는데 NOCHK에는 안들어가지만 EMPLOYEE에만 들어갔었다. 하지만 WITH CHECK OPTION을 했기 때문에 처리 자체가 안된다.

 

 

V_EMP_JOB_NOCHK 뷰를 통해서는 추가된 사원 정보를 볼 수 없습니다.

하지만, 기본테이블(EMPLOYEE)을 살펴보면 뷰를 통해 INSERT문이 처리되었음을 확인할 수있습니다.

위와 같이 혼돈을 주는 결과를 미연에 방지하기 위해서 WITH CHECK OPTION을 오라클에서는 제공해 주고 있습니다.

이것을 통해 뷰를 생성할 때 조건 제시에 사용된 칼럼 값을 변경하지 못하도록 기능을 제공합니다.

담당업무가 MANAGER인사원들을 조회하는 뷰 생성하기

SQL> -- V_EMP_JOB_NOCHK 뷰를 통해서는 추가된 사원 정보를 볼 수 없습니다.
SQL> -- 하지만, 기본테이블(EMPLOYEE)을 살펴보면 뷰를 통해 INSERT문이
SQL> -- 처리되었음을 확인할 수있습니다.
SQL> -- 위와 같이 혼돈을 주는 결과를 미연에 방지하기 위해서
SQL> -- WITH CHECK OPTION을 오라클에서는 제공해 주고 있습니다.
SQL> -- 이것을 통해 뷰를 생성할 때 조건 제시에 사용된 칼럼 값을 변경하지 못하도록 기능을 제공합니다.
SQL> -- 담당업무가 MANAGER인사원들을 조회하는 뷰 생성하기
SQL> CREATE OR REPLACE VIEW V_EMP_JOB_CHK
  2  AS
  3  SELECT ENO, ENAME, DNO, JOB
  4  FROM EMPLOYEE
  5  WHERE JOB LIKE 'MANAGER' WITH CHECK OPTION;

뷰가 생성되었습니다.

SQL> SELECT * FROM V_EMP_JOB_CHK;

       ENO ENAME             DNO JOB
---------- ---------- ---------- ---------
      7566 JONES              20 MANAGER
      7698 BLAKE              30 MANAGER
      7782 CLARK              10 MANAGER

CHECK OPTION에 위배되는 조건으로 오류가 뜬다.

SQL> INSERT INTO V_EMP_JOB_CHK
  2  VALUES(6000, '전지현', 20, 'SALESMAN');
INSERT INTO V_EMP_JOB_CHK
            *
1행에 오류:
ORA-01402: 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다

 

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

만약, WITH READ ONLY 옵션을 지정하지 않는 뷰는 추가, 수정, 삭제(INSERT/UPDATE/DELETE)가 모두 가능합니다.

 

담당 업무가 MANAGER인 사원드을 조회하는 뷰 생성하기

SQL> -- WITH READ ONLY를 사용하면 해당 뷰를 통해서는 SELECT만 가능하며
SQL> -- INSERT/UPDATE/DELETE를 할 수 없게 된다.
SQL> -- 만약, WITH READ ONLY 옵션을 지정하지 않는 뷰는
SQL> -- 추가, 수정, 삭제(INSERT/UPDATE/DELETE)가 모두 가능합니다.
SQL> -- 담당 업무가 MANAGER인 사원드을 조회하는 뷰 생성하기
SQL> CREATE OR REPLACE VIEW V_EMP_JOB_READONLY
  2  AS
  3  SELECT ENO, ENAME, DNO, JOB
  4  FROM EMPLOYEE
  5  WHERE JOB LIKE 'MANAGER' WITH READ ONLY;

뷰가 생성되었습니다.

뷰에 담당업무가 MANAGER인 사원 추가하기

(READ ONLY 적용으로 뷰에 데이터 추가 안됨)

SQL> -- 뷰에 담당업무가 MANAGER인 사원 추가하기
SQL> -- (READ ONLY 적용으로 뷰에 데이터 추가 안됨)
SQL> INSERT INTO V_EMP_JOB_READONLY
  2  VALUES(5000, '김태희', 10, 'MANAGER');
INSERT INTO V_EMP_JOB_READONLY
*
1행에 오류:
ORA-42399: 읽기 전용 뷰에서는 DML 작업을 수행할 수 없습니다.

<VIEW QUERY문 전체코드>

Microsoft Windows [Version 10.0.19045.3324]
(c) Microsoft Corporation. All rights reserved.

C:\Users\hi-guro>sqlplus hr/Test1234

SQL*Plus: Release 11.2.0.1.0 Production on 금 9월 8 09:44:24 2023

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


다음에 접속됨:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> -- 단순 뷰 정의하기
SQL> CREATE VIEW V_EMP_JOB(사번, 사원이름, 부서번호, 담당업무)
  2  as
  3  select eno, ename, dno, job
  4  from employee
  5  where job like 'SALESMAN';
CREATE VIEW V_EMP_JOB(사번, 사원이름, 부서번호, 담당업무)
            *
1행에 오류:
ORA-01031: 권한이 불충분합니다


SQL> CONN SYSTEM/System1234
연결되었습니다.
SQL> SHOW USER
USER은 "SYSTEM"입니다
SQL> GRANT DBA TO HR;

권한이 부여되었습니다.

SQL> REVOKE DBA FROM HR;

권한이 취소되었습니다.

SQL> GRANT DBA TO HR;

권한이 부여되었습니다.

SQL> SHOW USER
USER은 "SYSTEM"입니다

SQL> CONN HR/Test1234
연결되었습니다.

SQL> show user
USER은 "HR"입니다

SQL> -- 단순 뷰 생성하기
SQL> CREATE VIEW V_EMP_JOB(사번, 사원이름, 부서번호, 담당업무)
  2  AS
  3  SELECT ENO, ENAME, DNO, JOB
  4  FROM EMPLOYEE
  5  WHERE JOB LIKE 'SALESMAN';

뷰가 생성되었습니다.

SQL> select * from v_emp_job;

      사번 사원이름     부서번호 담당업무
---------- ---------- ---------- ---------
      7499 ALLEN              30 SALESMAN
      7521 WARD               30 SALESMAN
      7654 MARTIN             30 SALESMAN
      7844 TURNER             30 SALESMAN

SQL> -- 뷰를 생성할 때 칼럼명을 생략하면 기본 테이블의 칼럼명을 상속 받아서 표현합니다.
SQL> CREATE VIEW V_EMP_JOB2
  2  as
  3  select eno, ename, dno, job
  4  from employee
  5  where job like 'SALESMAN';

뷰가 생성되었습니다.

SQL> SELECT * FROM V_EMP_JOB;

      사번 사원이름     부서번호 담당업무
---------- ---------- ---------- ---------
      7499 ALLEN              30 SALESMAN
      7521 WARD               30 SALESMAN
      7654 MARTIN             30 SALESMAN
      7844 TURNER             30 SALESMAN

SQL> SELECT * FROM V_EMP_JOB2;

       ENO ENAME             DNO JOB
---------- ---------- ---------- ---------
      7499 ALLEN              30 SALESMAN
      7521 WARD               30 SALESMAN
      7654 MARTIN             30 SALESMAN
      7844 TURNER             30 SALESMAN

SQL> -- NATURAL JOIN 활용 DNO 칼럼을 공통으로 복합 뷰 생성하기
SQL> CREATE VIEW V_EMP_COMPLEX
  2  AS
  3  SELECT *
  4  FROM EMPLOYEE NATURAL JOIN DEPARTMENT;

뷰가 생성되었습니다.

SQL> set linesize 200;
SQL> set pagesize 50;
SQL> select * from v_emp_complex;

       DNO        ENO ENAME      JOB          MANAGER HIREDATE     SALARY COMMISSION DNAME          LOC
---------- ---------- ---------- --------- ---------- -------- ---------- ---------- -------------- -------------
        20       7369 SMITH      CLERK           7902 80/12/17        800            RESEARCH       DALLAS
        30       7499 ALLEN      SALESMAN        7698 81/02/20       1600        300 SALES          CHICAGO
        30       7521 WARD       SALESMAN        7698 81/02/22       1250        500 SALES          CHICAGO
        20       7566 JONES      MANAGER         7839 81/04/02       2975            RESEARCH       DALLAS
        30       7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400 SALES          CHICAGO
        30       7698 BLAKE      MANAGER         7839 81/05/01       2850            SALES          CHICAGO
        10       7782 CLARK      MANAGER         7839 81/06/09       2450            ACCOUNTING     NEW YORK
        20       7788 SCOTT      ANALYST         7566 87/07/13       3000            RESEARCH       DALLAS
        10       7839 KING       PRESIDENT            81/11/17       5000            ACCOUNTING     NEW YORK
        30       7844 TURNER     SALESMAN        7698 81/09/08       1500          0 SALES          CHICAGO
        20       7876 ADAMS      CLERK           7788 87/07/13       1100            RESEARCH       DALLAS
        30       7900 JAMES      CLERK           7698 81/12/03        950            SALES          CHICAGO
        20       7902 FORD       ANALYST         7566 81/12/03       3000            RESEARCH       DALLAS
        10       7934 MILLER     CLERK           7782 82/01/23       1300            ACCOUNTING     NEW YORK

14 개의 행이 선택되었습니다.

SQL> -- NATURAL JOIN : WHERE 절을 사용하지 않고 NATURAL JOIN 키워드를 사용하면
SQL> -- 오라클에서 자동적으로 테이블의 모든 칼럼을 대상으로 일치하는 데이터 유형
SQL> -- 및 이름을 가진 공통 칼럼을 조사한 후에 자동으로 조인을 수행합니다.
SQL> -- 사원테이블에서 급여와 커미션 칼럼을 제외한 나머지 칼럼으로 구성된 뷰 생성
SQL> CREATE VIEW V_EMP_SAMPLE
  2  AS
  3  SELECT ENO, ENAME, JOB, MANAGER, DNO
  4  FROM EMPLOYEE;

뷰가 생성되었습니다.

SQL> SELECT * FROM V_EMP_SAMPLE;

       ENO ENAME      JOB          MANAGER        DNO
---------- ---------- --------- ---------- ----------
      7369 SMITH      CLERK           7902         20
      7499 ALLEN      SALESMAN        7698         30
      7521 WARD       SALESMAN        7698         30
      7566 JONES      MANAGER         7839         20
      7654 MARTIN     SALESMAN        7698         30
      7698 BLAKE      MANAGER         7839         30
      7782 CLARK      MANAGER         7839         10
      7788 SCOTT      ANALYST         7566         20
      7839 KING       PRESIDENT                    10
      7844 TURNER     SALESMAN        7698         30
      7876 ADAMS      CLERK           7788         20
      7900 JAMES      CLERK           7698         30
      7902 FORD       ANALYST         7566         20
      7934 MILLER     CLERK           7782         10

14 개의 행이 선택되었습니다.

SQL> -- NATURAL JOIN 활용 DNO 칼럼을 공통으로 정보 제공을 위한 뷰 생성
SQL> CREATE VIEW V_EMP_COMPLEX2
  2  AS
  3  SELECT E.ENO, E.ENAME, E.SALARY, DNO, D.DNAME, D.LOC
  4  FROM EMPLOYEE E NATURAL JOIN DEPARTMENT D;

뷰가 생성되었습니다.

SQL> SELECT * FROM V_EMP_COMPLEX2;

       ENO ENAME          SALARY        DNO DNAME          LOC
---------- ---------- ---------- ---------- -------------- -------------
      7369 SMITH             800         20 RESEARCH       DALLAS
      7499 ALLEN            1600         30 SALES          CHICAGO
      7521 WARD             1250         30 SALES          CHICAGO
      7566 JONES            2975         20 RESEARCH       DALLAS
      7654 MARTIN           1250         30 SALES          CHICAGO
      7698 BLAKE            2850         30 SALES          CHICAGO
      7782 CLARK            2450         10 ACCOUNTING     NEW YORK
      7788 SCOTT            3000         20 RESEARCH       DALLAS
      7839 KING             5000         10 ACCOUNTING     NEW YORK
      7844 TURNER           1500         30 SALES          CHICAGO
      7876 ADAMS            1100         20 RESEARCH       DALLAS
      7900 JAMES             950         30 SALES          CHICAGO
      7902 FORD             3000         20 RESEARCH       DALLAS
      7934 MILLER           1300         10 ACCOUNTING     NEW YORK

14 개의 행이 선택되었습니다.

-- USER_VIEWS 데이터 사전을 활용한 VIEW_NAME, TEXT 정보 보기
SQL> SELECT VIEW_NAME, TEXT  FROM USER_VIEWS;

VIEW_NAME                      TEXT
------------------------------ --------------------------------------------------------------------------------
V_EMP_COMPLEX                  SELECT "DNO","ENO","ENAME","JOB","MANAGER","HIREDATE","SALARY","COMMISSION","DNA
V_EMP_COMPLEX2                 SELECT E.ENO, E.ENAME, E.SALARY, DNO, D.DNAME, D.LOC
                               FROM EMPLOYEE E NATURAL JOI

V_EMP_JOB                      select eno, ename, dno, job
                               from employee
                               where job like 'SALESMAN'

V_EMP_JOB2                     select eno, ename, dno, job
                               from employee
                               where job like 'SALESMAN'

V_EMP_SAMPLE                   SELECT ENO, ENAME, JOB, MANAGER, DNO
                               FROM EMPLOYEE

SQL> -- 뷰를 통해 기본 테이블에 데이터 추가하기
SQL> INSERT INTO V_EMP_JOB
  2  VALUES(3000, '김희선', 30, 'SALESMAN');

1 개의 행이 만들어졌습니다.

SQL> SELECT * FROM V_EMP_JOB;

      사번 사원이름     부서번호 담당업무
---------- ---------- ---------- ---------
      7499 ALLEN              30 SALESMAN
      7521 WARD               30 SALESMAN
      7654 MARTIN             30 SALESMAN
      7844 TURNER             30 SALESMAN
      3000 김희선             30 SALESMAN

SQL> SELECT * FROM EMPLOYEE;

       ENO ENAME      JOB          MANAGER HIREDATE     SALARY COMMISSION
 DNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80/12/17        800
  20
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300
  30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500
  30
      7566 JONES      MANAGER         7839 81/04/02       2975
  20
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400
  30
      7698 BLAKE      MANAGER         7839 81/05/01       2850
  30
      7782 CLARK      MANAGER         7839 81/06/09       2450
  10
      7788 SCOTT      ANALYST         7566 87/07/13       3000
  20
      7839 KING       PRESIDENT            81/11/17       5000
  10
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0
  30
      7876 ADAMS      CLERK           7788 87/07/13       1100
  20
      7900 JAMES      CLERK           7698 81/12/03        950
  30
      7902 FORD       ANALYST         7566 81/12/03       3000
  20
      7934 MILLER     CLERK           7782 82/01/23       1300
  10
      3000 김희선     SALESMAN
  30

15 개의 행이 선택되었습니다.


SQL> -- 뷰에 그룹함수 사용하기(별칭 사용)
SQL> CREATE VIEW V_EMP_SALARY
  2  AS
  3  SELECT DNO, SUM(SALARY) AS "봉급 합계", AVG(SALARY) AS "봉급 평균"
  4  FROM EMPLOYEE
  5  GROUP BY DNO;

뷰가 생성되었습니다.

SQL> SELECT * FROM V_EMP_SALARY;

       DNO  봉급 합계  봉급 평균
---------- ---------- ----------
        30       9400 1566.66667
        20      10875       2175
        10       8750 2916.66667

SQL> -- 그룹함수(GROUP BY)를 사용한 뷰를 사용할 때에는 칼럼 별칭을 주어야 합니다.
SQL> -- 그룹함수(GROUP BY)를 가상 칼럼으로 갖고 있는 뷰에 대해서는 DML문을 사용할 수 없습니다.
SQL> -- 그룹함수(GROUP BY)를 가상 칼럼으로 갖고 있는 뷰에 데이터 추가 에러 확인
SQL> INSERT INTO V_EMP_SALARY VALUES(80, 1000, 3000);
INSERT INTO V_EMP_SALARY VALUES(80, 1000, 3000)
*
1행에 오류:
ORA-01733: 가상 열은 사용할 수 없습니다


SQL> -- 뷰 제거하기
SQL> DROP VIEW V_EMP_JOB2;

뷰가 삭제되었습니다.

SQL> -- 뷰 제거 확인하기
SQL> SELECT VIEW_NAME, TEXT FROM USER_VIEWS;

VIEW_NAME                      TEXT
------------------------------ --------------------------------------------------------------------------------
V_EMP_COMPLEX                  SELECT "DNO","ENO","ENAME","JOB","MANAGER","HIREDATE","SALARY","COMMISSION","DNA
V_EMP_COMPLEX2                 SELECT E.ENO, E.ENAME, E.SALARY, DNO, D.DNAME, D.LOC
                               FROM EMPLOYEE E NATURAL JOI

V_EMP_JOB2                     select eno, ename, dno, job
                               from employee
                               where job like 'SALESMAN'

V_EMP_SALARY                   SELECT DNO, SUM(SALARY) AS "봉급 합계", AVG(SALARY) AS "봉급 평균"
                               FROM EMPLOYEE

V_EMP_SAMPLE                   SELECT ENO, ENAME, JOB, MANAGER, DNO
                               FROM EMPLOYEE



SQL> -- CREATE VIEW : 존재하지 않는 뷰를 새롭게 생성할 때 사용합니다.
SQL> -- CREATE OR REPLACE : 존재하지 않는 뷰를 새롭게 생성하는 것도 되고
SQL> --                     기존의 뷰에 대한 내용 변경도 가능합니다.
SQL> --                     일반적으로 많이 사용합니다.
SQL> -- 뷰 내용 생성(또는 변경)하기
SQL> CREATE OR REPLACE VIEW V_EMP_JOB2
  2  AS
  3  SELECT ENO, ENAME, DNO, JOB
  4  FROM EMPLOYEE
  5  WHERE JOB LIKE 'MANAGER';

뷰가 생성되었습니다.

SQL> SELECT * FROM V_EMP_JOB2;

       ENO ENAME             DNO JOB
---------- ---------- ---------- ---------
      7566 JONES              20 MANAGER
      7698 BLAKE              30 MANAGER
      7782 CLARK              10 MANAGER

SQL> -- WITH CHECK OPTION을 사용하면, 해당 뷰를 통해서 볼 수 있는
SQL> -- 범위 내에서만 UPDATE 또는 INSERT가 가능합니다.
SQL> -- 담당 업무가 MANAGER인 사원들을 조회하는 뷰 생성하기
SQL> CREATE OR REPLACE VIEW V_EMP_JOB_NOCHK
  2  AS
  3  SELECT ENO, ENAME, DNO, JOB
  4  FROM EMPLOYEE
  5  WHERE JOB LIKE 'MANAGER';

뷰가 생성되었습니다.

SQL> SELECT * FROM V_EMP_JOB_NOCHK;

       ENO ENAME             DNO JOB
---------- ---------- ---------- ---------
      7566 JONES              20 MANAGER
      7698 BLAKE              30 MANAGER
      7782 CLARK              10 MANAGER

SQL> -- 위에서 생성한 V_EMP_JOB_NOCHK 뷰에 사원을 추가하는데, 이때
SQL> -- 담당 업무를 SALESMAN으로 지정해서 추가해 봅니다.
SQL> INSERT INTO V_EMP_JOB_NOCHK
  2  VALUES(9000, '김다미', 30, 'SALESMAN');

1 개의 행이 만들어졌습니다.

SQL> SELECT * FROM V_EMP_JOB_NOCHK;

       ENO ENAME             DNO JOB
---------- ---------- ---------- ---------
      7566 JONES              20 MANAGER
      7698 BLAKE              30 MANAGER
      7782 CLARK              10 MANAGER

SQL> SELECT * FROM EMPLOYEE;

       ENO ENAME      JOB          MANAGER HIREDATE     SALARY COMMISSION        DNO
---------- ---------- --------- ---------- -------- ---------- ---------- ----------
      7369 SMITH      CLERK           7902 80/12/17        800                    20
      7499 ALLEN      SALESMAN        7698 81/02/20       1600        300         30
      7521 WARD       SALESMAN        7698 81/02/22       1250        500         30
      7566 JONES      MANAGER         7839 81/04/02       2975                    20
      7654 MARTIN     SALESMAN        7698 81/09/28       1250       1400         30
      7698 BLAKE      MANAGER         7839 81/05/01       2850                    30
      7782 CLARK      MANAGER         7839 81/06/09       2450                    10
      7788 SCOTT      ANALYST         7566 87/07/13       3000                    20
      7839 KING       PRESIDENT            81/11/17       5000                    10
      7844 TURNER     SALESMAN        7698 81/09/08       1500          0         30
      7876 ADAMS      CLERK           7788 87/07/13       1100                    20
      7900 JAMES      CLERK           7698 81/12/03        950                    30
      7902 FORD       ANALYST         7566 81/12/03       3000                    20
      7934 MILLER     CLERK           7782 82/01/23       1300                    10
      3000 김희선     SALESMAN                                                    30
      9000 김다미     SALESMAN                                                    30

16 개의 행이 선택되었습니다.

SQL> -- V_EMP_JOB_NOCHK 뷰를 통해서는 추가된 사원 정보를 볼 수가 없습니다.
SQL> -- 하지만, 기본 테이블(EMPLOYEE)을 살펴보면 뷰를 통해 INSERT문이
SQL> -- 처리되었음을 확인할 수 있습니다.
SQL> -- 위와 같이 혼돈을 주는 결과를 미연에 방지하기 위해서
SQL> -- WITH CHECK OPTION을 오라클에서는 제공해 주고 있습니다.
SQL> -- 이것을 통해 뷰를 생성할 때 조건 제시에 사용된 칼럼 값을 변경하지
SQL> -- 못하도록 기능을 제공합니다.
SQL> -- 담당 업무가 MANAGER인 사원들을 조회하는 뷰 생성하기
SQL> CREATE OR REPLACE VIEW V_EMP_JOB_CHK
  2  AS
  3  SELECT ENO, ENAME, DNO, JOB
  4  FROM EMPLOYEE
  5  WHERE JOB LIKE 'MANAGER' WITH CHECK OPTION;

뷰가 생성되었습니다.

SQL> SELECT * FROM V_EMP_JOB_CHK;

       ENO ENAME             DNO JOB
---------- ---------- ---------- ---------
      7566 JONES              20 MANAGER
      7698 BLAKE              30 MANAGER
      7782 CLARK              10 MANAGER

SQL> INSERT INTO V_EMP_JOB_CHK
  2  VALUES(6000, '전지현', 20, 'SALESMAN');
INSERT INTO V_EMP_JOB_CHK
            *
1행에 오류:
ORA-01402: 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다


SQL> -- WITH READ ONLY를 사용하면 해당 뷰를 통해서는 SELECT만 가능하며
SQL> -- INSERT/UPDATE/DELETE를 할 수 없게 됩니다.
SQL> -- 만약, WITH READ ONLY 옵션을 지정하지 않는 뷰는
SQL> -- 추가, 수정, 삭제(INSERT/UPDATE/DELETE)가 모두 가능합니다.
SQL> -- 담당 업무가 MANAGER인 사원들을 조회하는 뷰 생성하기
SQL> CREATE OR REPLACE VIEW V_EMP_JOB_READONLY
  2  AS
  3  SELECT ENO, ENAME, DNO, JOB
  4  FROM EMPLOYEE
  5  WHERE JOB LIKE 'MANAGER' WITH READ ONLY;

뷰가 생성되었습니다.

SQL> -- 뷰에 담당 업무가 MANAGER인 사원 추가하기 (READ ONLY 적용으로 뷰에 데이터 추가 안됨)
SQL> INSERT INTO V_EMP_JOB_READONLY
  2  VALUES(5000, '김태희', 10, 'MANAGER');
INSERT INTO V_EMP_JOB_READONLY
*
1행에 오류:
ORA-42399: 읽기 전용 뷰에서는 DML 작업을 수행할 수 없습니다.


SQL>
728x90
반응형