※ 뷰(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>
'☭DEVELOPER > #2 웹개발(자바기반 풀스택)' 카테고리의 다른 글
[WEB] Path 경로 설정 이해 (0) | 2023.09.13 |
---|---|
[SQL/JAVA] 이클립스에서 오라클 DB 연동 개발 환경 설정 (0) | 2023.09.11 |
[SQL]테이블 생성 수정 제거하기 (0) | 2023.09.07 |
[BACKEND]코딩테스트10 (0) | 2023.09.07 |
[SQL]테이블 조인 (0) | 2023.09.06 |