DB/Oracle

뷰 VIEW

hs_developer 2022. 7. 1. 15:00

오라클에서 VIEW는 실제로 데이터를 저장하고 있지 않지만 DML 작업이 가능한 가상의 테이블이다.

 

ㅇ뷰는 복잡한 쿼리를 단순화할 수 있다.
ㅇ뷰는 사용자에게 필요한 정보만 접근하도록 접근을 제한할 수 있다.

 

CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW 뷰이름 [(column_aliases)]
AS
SELECT문
[WITH READ ONLY]
[WITH CHECK OPTION [CONSTRAINT 제약조건명]]

 

- OR REPLACE : 해당 구문을 사용하면 뷰를 수정할 때 DROP 없이 수정 가능.

- FORCE: 뷰를 생성할 때 쿼리문의 테이블, 컬럼, 함수 등이 존재하지 않아도 생성 가능.

- NORORCE: 뷰를 생성할 때 쿼리문의 테이블, 컬럼, 함수 등이 존재하지 않으면 생성되지 않는다.

-column_aliases: SELECT 컬럼의 별칭을 미리 정의할 수 있다.

-WITH READ ONLY: SELECT만 가능하다. (INSERT, UPDATE, DELETE 불가능)

-WITH CHECK OPTION: WHERE절의 조건에 해당하는 데이터만 저장, 변경이 가능하다.

 

단순 뷰 생성

-- 일반 계정은 뷰를 생성하는 권한이 없다.
grant create view to hr; -- 권한 부여
revoke create view from hr; -- 권한 취소

create or replace view v_emp
as
select empno, ename, job, hiredate
from emp;

 

단순 뷰는 단일 테이블에 컬럼을 나열한 것이고, 조인, 함수, group by, union 등을 사용하지 않으며, select, insert, update, delete를 자유롭게 사용 가능하다.

 

 

복합 뷰 생성

create or replace view v_emp
as
select a.empno, a.ename, a.job, to_char(a.hiredate, 'YYYY-MM-DD') as hiredate
from emp a, dept b
where a.deptno = b.deptno;

복합 뷰는 조인, 함수, group by, union 등을 사용해 뷰를 생성한다. 

함수 등을 사용할 경우 컬럼 별칭은 꼭 부여해야 한다. ex) as hiredate

복합 뷰는 select가 가능하지만 insert, update, delete는 상황에 따라 가능하지 않을 수도 있다.

 

* 단순 뷰와 복합 뷰는 동일한 뷰를 의미한다.

 

 

뷰 컬럼 코멘트 추가

comment on column v_emp.empno is'사원번호';

 

테이블 컬럼 코멘트와 동일하게 뷰의 컬럼 코멘트도 입력 가능하다.

 

뷰 삭제

drop view v_emp;

 

FORCE 

create or replace force view v_emp
as
select empno, ename, job, hiredate
from emp

FORCE를 사용하면 쿼리문에 테이블, 컬럼, 함수 등이 존재하지 않을 경우 오류가 발생하지만 뷰는 생성되며 INVALID 상태이기 때문에 뷰는 동작하지 않는다. 

 

테이블, 함수 등을 미리 생성하지 않고 뷰를 먼저 생성해 놓는 경유 유용하다.

 

 

WITH READ ONLY

create or replace view v_emp
as
select empno, ename, job, hiredate
from emp
with read only

select만 가능하고 insert, update, delete는 불가능하다.

 

 

WITH CHECK OPTION

-- 계약 조건명을 지정하지 않은 경우
create or replace view v_emp
as
select empno, ename, job, hiredate, deptno
from emp
where deptno='10'
with check option;

-- 계약 조건명을 지정한 경우
create or replace view v_emp
as
select empno, ename, job, hiredate, deptno
from emp
where deptno='10'
with check option constraint emp_ck;

 

insert, update, delete 사용 시 where절의 조건에 해당하는 데이터만 접근 가능하다. ex) deptno='10'

 

with check option [constraint 제약조건명]

제약조건명을 지정하지 않아도 기능은 동일하게 작동하며, 제약조건이 생성될 때 원하는 이름으로 생성되느냐 시스템이 자동으로 이름을 부여하느냐의 차이이다. 

 

 

 

참고

https://gent.tistory.com/361