[ORACLE] VIEW(뷰)

sleeee·2023년 5월 7일
0

SQL

목록 보기
13/19

뷰(View)

: 뷰는 테이블에 대한 가상테이블로써 select로 조회된 데이터들의 가상테이블이다.

1.형식

CREATE [OR REPLACE] VIEW 뷰이름
	AS
	서브쿼리;
	[ WITH CHECK OPTION ]
	[ WITH READ ONLY ])
CREATE VIEW EMP01
--수정하고싶을땐
--CREATE OR REPLACE VIEW EMP01
--의미 :없으면 생성 있으면 덮어씌우기
AS
    SELECT EMPNO,ENAME,SAL,DEPTNO
    FROM EMP;
    / --실행 
    SELECT *FROM EMP01;

2. 사용이유

  • 보안 설정
  • 복잡하고 자주 사용되는 질의를 뷰를 통해서 쉽게 사용하기 위해

예1)

  • 뷰생성 권한 부여하기
conn system/java1234   -- 뷰생성 권한 부여를 위해 system계정으로 접속
GRANT CREATE VIEW TO scott; -- scott계정에게 뷰생성 권한 부여
conn scott/tiger   -- scott계정으로 접속

3. 뷰의 종류

1. 단일뷰

: 하나의 테이블로 생성되는 뷰(기본적으로 DML작업이 됨)

1)
CREATE OR REPLACE VIEW EMP01
AS
	SELECT EMPNO,ENAME,SAL,DEPTNO
    FROM EMP;
/
INSERT INTO EMP01 VALUES(2000,'이씨',1000,10)
--뷰에 데이터 추가=> 원본 테이블에도 적용됨
SELECT * FROM EMP;2)
CREATE OR REPLACE VIEW EMP01
AS
	SELECT EMPNO,ENAME,SAL,DEPTNO
    FROM EMP
WITH READ ONLY;
/
INSERT INTO EMP01 VALUES(2001,'이씨',1000,10); --오류발생
--오류 보고 -
--SQL 오류: ORA-42399: 읽기 전용 뷰에서는 DML 작업을 수행할 수 없습니다.
--42399.0000 - "cannot perform a DML operation on a read-only view"

2. 복합뷰

: 두 개이상의 테이블로 생성되는 뷰(조인된 뷰).DML작업을 못함

CREATE OR REPLACE VIEW EMP02
AS
	SELECT E.EMPNO,E.ENAME,D.DNAME,D.DEPTNO
    FROM EMP E,DEPT D
    WHERE E.DEPTNO=D.DEPTNOL
 /
 SELECT * FROM EMP02;
 INSERT INTO EMP02 VALUES(2003,'D','부서1',60); --오류발생
 --오류 보고 -
SQL 오류: ORA-01776: 조인 뷰에 의하여 하나 이상의 기본 테이블을 수정할 수 없습니다.
01776. 00000 -  "cannot modify more than one base table through a join view"
*Cause:    Columns belonging to more than one underlying table were either
           inserted into or updated.
*Action:   Phrase the statement as two or more separate statements.

DROP VIEW EMP02;

4. 뷰 삭제하기

형식)
DROP VIEW 뷰이름;

예제

Q1. EMP테이블과 DEPT테이블을 이용해서 이름,직업,부서,부서명을 조회하는
뷰를 만들고 사용해 보세요.
사용후 뷰 삭제하기

CREATE OR REPLACE VIEW EMP04
AS
	SELECT E.ENAME,E.JOB,D.DEPTNO,D.DNAME
    FROM EMP E INNER JOIN DEPT D --조인 사용
    WHERE E.DEPTNO=D.DEPTNO;
/

SELECT*FROM EMP04;
DROP VIEW EMP04;

Q3.

CREATE OR REPLACE VIEW EMP01
AS
    SELECT EMPNO,ENAME,SAL,DEPTNO
    FROM EMP
WHERE DEPTNO>=20
WITH CHECK OPTION --뷰의 조건에 맞는 데이터만 DML할 수 있음
/

SELECT * FROM EMP01;
SELECT * FROM EMP;

INSERT INTO EMP01 VALUES(11,'홍',1000,20); --가능

INSERT INTO EMP01 VALUES(13,'홍',1000,10);
--뷰의 조건에 맞지 않으므로 에러
--오류 보고 -
ORA-01402: 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다
profile
개인 공부 기록 👩‍💻

0개의 댓글