본문 바로가기
프로그래밍 공부 정리/database

View(뷰), System View(시스템 뷰)

by 메기사랑 2021. 11. 27.

View
==> 실제로는 존재 하지 않는 논리적인 가상의 테이블을 말합니다.
==> 자주사용하는 복잡한 조건식을 갖는 select문이 있다면
그것을 조회하는 sql명령를 뷰로 만들어놓으면
사용이 용이합니다.
==> 보안유지상 특정 테이블의 칼럼을 제한하여 접근할 수 있도록 
할때에도 뷰를 사용합니다.

** 뷰를 만드는 방법

create view 뷰이름 as select 문

 

 

ex) 오늘날짜의 출판사별 총판매수량, 총판매금액을 출력
select publisher, count(publisher) cnt, nvl(sum(saleprice),0) sum
from book b, orders o
where b.bookid = o.bookid(+) and 
to_char(orderdate, 'yyyy/mm/dd') = to_char(sysdate,'yyyy/mm/dd')
group by publisher;
===> A

select distinct publisher, 0 cnt from book;
==> B

A의cnt + B의 cnt

select b.publisher, nvl(A.cnt,0) cnt, nvl(A.sum, 0) sum from 
(select publisher, count(publisher) cnt, nvl(sum(saleprice),0) sum
from book b, orders o
where b.bookid = o.bookid(+) and 
to_char(orderdate, 'yyyy/mm/dd') = to_char(sysdate,'yyyy/mm/dd')
group by publisher) A right outer join (select distinct publisher, 0 cnt from book) B
on A.publisher = B.publisher
order by nvl(A.cnt,0) desc;


==> 위와같이 조회할 일이 많다고 할 때에 
매번 sql를 작성하는 것은 번거로운 일입니다.

이런경우 뷰(View)를 만들어두면 조회를 쉽게 할 수 있어요.

create view today_sale 
as 
select b.publisher, nvl(A.cnt,0) cnt, nvl(A.sum, 0) sum from 
(select publisher, count(publisher) cnt, nvl(sum(saleprice),0) sum
from book b, orders o
where b.bookid = o.bookid(+) and 
to_char(orderdate, 'yyyy/mm/dd') = to_char(sysdate,'yyyy/mm/dd')
group by publisher) A right outer join (select distinct publisher, 0 cnt from book) B
on A.publisher = B.publisher
order by nvl(A.cnt,0) desc;

select * from today_sale;
ex) 도서명에 "축구"를 포함하고 있는 도서의 정보를 조회하는 
뷰를 생성해 봅니다.
뷰이름은 vw_book이라고 합니다.

create view vw_book
as 
select * from book
where bookname like '%축구%';



** view를 사용하는 목적
- 자주사용하는 복잡한 sql를 대신 보안유지상 사용자별로 조회할 수 있는 컬럼을 제한



** 뷰를통하여 insert, update, delete를 실험해 봅시다.

insert into vw_emp20 values(2000, '홍길동', '서울', '010-7777-7777', 20);
==> 뷰를 통하여 insert할 수 있어요.
실제로 레코드는 뷰를 생성할 때 사용한 모테이블에 추가됩니다.
그렇기 때문에 뷰생성시에 사용한 컬럼 이외의 칼럼들은 null을 허용하거나 default값이 설정되어 있어야 합니다.

update vw_emp20 set addr = '서울' where eno= 1010;
==> 뷰를 통하여 update를 할 수 있어요.
뷰 생성시에 사용한 모테이블의 내용이 수정됩니다.


delete vw_emp20 where eno = 1014;
==> 뷰를 통하여 delete를 수행 할 수 있어요.
실제 레코드가 있는 모테이블에서 삭제가 수행됩니다.




**뷰를생성시의 조건에 맞지 않는 레코드를 추가 할 수 있는지 실험 해 봅니다.

insert into vw_emp20 values(3000, '이순신', '서울', '010-9999-9999', 30);


===> 뷰를 생성시에 조건에 맞지 않는 레코드를 추가 할 수 있어요.
그러나 뷰에는 나타지않고 
모테이블에 추가 되었습니다.

**뷰를 생성시에 조건에 맞지 않는 값으로 레코드를 수정할 수 있는지 실험 해 봅니다.

update vw_emp20 set dno =30 where eno = 2000;


==> 뷰를 생성시 설정한 조건에 맞지 않은 값을 뷰를통해 update할 수 있어요.
모테이블의 내용이 변경되고 뷰에는 조건에 맞지 않기 때문에 나타나지 않아요.



** 뷰를 삭제하는 방법

drop view 뷰이름;



** 뷰를 생성시에 설정한 
조건에 맞지 않는 레코드를 추가할 수 없도록
조건에 맞지 않는 값으로 수정할 수 없도록 
하고싶어요!!

create view 뷰이름 as select ~~ 조건식 with check option;

 

with check option를 설정하여 뷰를 생성한 다음
조건에 맞지 않는 레코드를 추가하고 
조건에 맞지 않는 값으로 수정 해 봅니다.

create view vw_emp20
as 
select eno,ename,addr,phone,dno
from emp
where dno =20
with check option;

insert into vw_emp20 values(4000, '유관순', '서울', 010-0000-0000, 20);
insert into vw_emp20 values(5000, '문재인', '서울', 010-0000-0000, 30);

insert into vw_emp20 values(5000, '문재인', '서울', 010-0000-0000, 30)
            *
1행에 오류:
ORA-01402: 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다
==> 뷰 생성시에 with check option을 주었기 때문에 
조건에 맞지 않는 레코드를 추가 없어요!

update vw_emp20 set phone = '010-2222-2222' where eno = 4000;
update vw_emp20 set dno = 30 where eno = 1010;

SQL> update vw_emp20 set dno = 30 where eno = 1010;
update vw_emp20 set dno = 30 where eno = 1010
       *
1행에 오류:
ORA-01402: 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다




**조회(읽기)만 가능한 뷰를 생성

create view 뷰이름 as select ~~  with read only;
ex) vw_emp20을 삭제하고 읽기만 가능한 뷰로 만들어 
데이터를 추가,수정,삭제,조회를 실험해 봅니다.

create view vw_emp20
as
select eno, ename, addr, phone, dno
from emp
where dno = 20
with read only;

select * from vw_emp20;
insert into vw_emp20 values(4001, '김유신', '서울', '010-2222-2222', 20);
1행에 오류:
ORA-42399: 읽기 전용 뷰에서는 DML 작업을 수행할 수 없습니다.

update vw_emp20 set addr = '인천' where eno = 1010;
1행에 오류:
ORA-42399: 읽기 전용 뷰에서는 DML 작업을 수행할 수 없습니다.

delete vw_emp20 where eno = 4000;
1행에 오류:
ORA-42399: 읽기 전용 뷰에서는 DML 작업을 수행할 수 없습니다.




**정리** view에 대하여 설명하시오.
실제로는 존재하지 않는 가상의 논리적인 테이블을 말하며 
복잡한 sql를 대신하거나
사용자별 접근권한을 설정하는 용도로 사용합니다.

뷰를 통해서 추가,수정,삭제가 가능하며

with check option를 설정하여 조건에 맞는 레코드만 추가,수정할 수 있도록 하고
with read only 옵션을 설정하여 읽기만 가능한 뷰를 만들 수 있어요.

 

 

 

 

 


시스템 뷰
==> 오라클이 제공하는 데이터사전을 말합니다.

user_obejcts 사용자가 만든 모든 객체의 정보를 갖고 있어요.
user_tables 사용자 가 만든 모든 테이블의 정보를 갖고 있어요.
user_constraints 사용자가 만든 모든 제약의 정보를 갖고 있어요.


==> 제약의 비활성화

alter table 테이블이름 disable constraint 제약명;



==> 제약의 활성화

alter table 테이블이름 enable constraint 제약명;
SYS_C008320     R                    ORDERS     ENABLED
SYS_C008319     R                    ORDERS     ENABLED
SYS_C008316     P                    BOOK       ENABLED

insert into book values(14, '즐거운 오라클', '쌍용미디어', 30000);

*
1행에 오류:
ORA-00001: 무결성 제약 조건(C##MADANG.SYS_C008316)에 위배됩니다

-------------------------------------------------------------------------------------------------------
alter table orders disable constraint SYS_C008320;
alter table orders disable constraint SYS_C008319;
alter table book disable constraint SYS_C008316;

 select constraint_name, constraint_type, table_name, status from user_constraints;

insert into book values(14, '즐거운 오라클', '쌍용미디어', 30000);

==> 제약을 활성화를 하려면
활성화 하려는 제약에대하여 
만족하는 상태로 만들어야 합니다.

alter table book enable constraint  SYS_C008316;
alter table orders enable constraint SYS_C008319;
alter table orders enable constraint SYS_C008320;


SQL> alter table book enable constraint SYS_C008316;
alter table book enable constraint SYS_C008316
*
1행에 오류:
ORA-02437: (C##MADANG.SYS_C008316)을 검증할 수 없습니다 - 잘못된 기본 키입니다
===> 활성화 하려는 제약에 대한 만족하지 않는 데이터 있어서 오류가 발생합니다.

delete book where bookname '재미있는 자바';

SQL> alter table book enable constraint SYS_C008316;

테이블이 변경되었습니다.

SQL> alter table orders enable constraint SYS_C008319;

테이블이 변경되었습니다.

SQL> alter table orders enable constraint SYS_C008320;

테이블이 변경되었습니다.



insert into book values(14, '재밌는 웹', '쌍용미디어', 35000);

SQL> insert into book values(14, '재밌는 웹', '쌍용미디어', 35000);
insert into book values(14, '재밌는 웹', '쌍용미디어', 35000)
*
1행에 오류:
ORA-00001: 무결성 제약 조건(C##MADANG.SYS_C008316)에 위배됩니다

===> 제약이 활성화 되어 동일한 도서번호의 레코드를 추가할 수 없어요

'프로그래밍 공부 정리 > database' 카테고리의 다른 글

View의 장단점, View와 Table의 차이  (0) 2021.11.29
Index(인덱스)  (0) 2021.11.28
시퀀스(sequence), 다중행 연산자  (0) 2021.11.26
rownum, 서브쿼리  (0) 2021.11.25
날짜 관련 함수, null 처리  (0) 2021.11.24