Oracle

[Oracle]days 14 -뷰

애플쩀 2022. 4. 21. 14:24

 

가상의 테이블 

테이블을 보기위한 창문이라고 생각하면 된다. 

뷰를 통해 insert, update,delete가 가능하지만 대부분 select 를 하기 위해서 사용 

뷰 생성 - 한개의 테이블 

          -  또다른 뷰              를 이용하여 뷰를 만들 수 있다. 

목적: 일부만 접근할 수 있도록 제한하기 위한 것 

뷰 생성한다는 의미: 데이터 딕셔너리( 자료사전) 테이블에 뷰에 대한 정의만 저장되고 

실제 디스크에 저장공간이 할당되지 않는다. 

 

보안성+편리성 

뷰의 종류: 심플뷰 -1개의 테이블  , 복합뷰  - 여러개 테이블 

 

옵션 설 명 
OR REPLACE 같은 이름의 뷰가 있을 경우 무시하고 다시 생성 
FORCE 기본 테이블의 유무에 상관없이 뷰를 생성 
NOFORCE 기본 테이블이 있을 때만 뷰를 생성 
ALIAS 기본 테이블의 컬럼이름과 다르게 지정한 뷰의 컬럼명 부여 
WITH CHECK OPTION 뷰에 의해 access될 수 있는 행(row)만이 삽입, 수정 가능 
WITH READ ONLY DML 작업을 제한(단지 읽는 것만 가능) 

 

뷰생성

【형식】
	CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW 뷰이름
		[(alias[,alias]...]
	AS subquery
	[WITH CHECK OPTION]
	[WITH READ ONLY];
create view 뷰이름
as 서브쿼리 

생성된 뷰를 사용
or replace - [ 뷰명]이 없으면 생성하고 있으면 수정한다.
create or replace view panmai
as 서브쿼리 
with read only; --단순히 읽기작업

존재하지 않는 테이블이어도 뷰는 생성할 수 있다.

뷰삭제- 
drop view 뷰명 
create or replace view panView
(bookid, booktitle, bookdanga, gogaekid, gogaekname,pdate)
as 
    select b.b_id, price, g.g_id, g_name, p_date, p_su
    from book b join danga d on b.b_id =d.b_id
            join panmai p on p.b_id =b.b_id
            join gogaek g on g.g_id=p.g_id;
            
    
    insuffcient privilleges 권한부여 해야한다. 
    sys로 가서 scott에 권한 부여 --  grant create view to scott; 
    
     "invalid number of column names specified"에러가 나서 p_su 지우니 되었음

 

권한 확인 
     select *
     from user_sys_privs;

desc panview;

 

뷰 소스 확인 
select *
from user_views
where view_name='panview';

 

select view (p_su*bookdanga) 전체판매금액
from panview;

 

뷰 생성

년도, 월, 고객코드, 고객명 ,판매금액합 (년도별 월별) 출력 (조회) 

뷰- gogaekview 

 CREATE OR REPLACE VIEW gogaekView
     AS 
        SELECT TO_CHAR(p_date, 'YYYY')year,TO_CHAR(p_date, 'MM')month
                ,g.g_id, g_name, SUM(p_su * price)amt
        FROM panmai p JOIN danga d ON p.b_id=d.b_id
                      JOIN gogaek g ON p.g_id=g.g_id
        GROUP BY TO_CHAR(p_date, 'YYYY'),TO_CHAR(p_date, 'MM'),g_name,g.g_id
        ORDER BY TO_CHAR(p_date, 'YYYY'),TO_CHAR(p_date, 'MM');

 

어떤 뷰가 있는 지 확인
 from user_views;
 ==테이블
 from user_tables;
--제약조건 
 from user_constraints;

 

뷰를 사용하여 dml 작업 가능 
 --뷰를 사용하여 dml 작업 가능 select
  CREATE TABLE testa(
  aid        number primary key
  , name    varchar2(20) not null
  , tel    varchar2(20) not null
  , memo   varchar2(100)
);       
 
CREATE TABLE testb(
   bid  number primary key
   , aid  number constraint fk_testb_aid references testa(aid) on delete cascade
   , score number(3)
); 
 
 
INSERT INTO testa (aid, NAME, tel) VALUES (1, 'a', '1');
INSERT INTO testa (aid, name, tel) VALUES (2, 'b', '2');
INSERT INTO testa (aid, name, tel) VALUES (3, 'c', '3');
INSERT INTO testa (aid, name, tel) VALUES (4, 'd', '4');

INSERT INTO testb (bid, aid, score) VALUES (1, 1, 80);
INSERT INTO testb (bid, aid, score) VALUES (2, 2, 70);
INSERT INTO testb (bid, aid, score) VALUES (3, 3, 90);
INSERT INTO testb (bid, aid, score) VALUES (4, 4, 100);

commit;
select * from testa;
1	a	1	
2	b	2	
3	c	3	
4	d	4		
select * from testb;
1	1	80
2	2	70
3	3	90
4	4	100

--하나의 테이블로 부터 뷰를 만드는것 -simple view 
create or replace view aview
as 
select aid, name, memo
from testa ;

select * from aview;

aview를 이용하여 insert 작업 
insert into aview (aid,name,memo) values (5,'f',null);
--cannot insert NULL into ("SCOTT"."TESTA"."TEL")
--뷰를통해서 dml 가능하지만 select 를 위해서 
--tel이 없는 뷰를 만들었기 때문에 insert가 안된다. 

create or replace view aview
as 
select aid, name,tel
from testa ;
--View AVIEW이(가) 생성되었습니다.
insert into aview (aid,name,tel) values (5,'f','5');

--실제테이블에 not null인 칼럼은 꼭 주어야 한다. 

commit;
select *
from testa;
--실제로 데이터가 들어가져있다 

create or replace view abview 
as 
select a.aid, name, tel, bid, score
from testa a join testb b on a.aid=b.aid;

select *
from abview;

--복합뷰를 이용하여 insert
-- 복합뷰 -동시에 두테이블에 insert작업xxxxx

 

with check option 

뷰에 의해 access될 수 있는 행만 삽입 , 수정가능 

create or replace view bview
as
    select bid, aid, score
    from testb
    where score>=90
with check option constraint ck_bview;
--90점 미만은 수정작업이 안됨 
INSERT INTO bview (bid, aid, score) VALUES (5,4,100);
--1 행 이(가) 삽입되었습니다.
INSERT INTO bview (bid, aid, score) VALUES (5,4,30);
--ORA-01402: view WITH CHECK OPTION where-clause violation

 

물리적뷰  -빅데이터에 사용 

실제 물리적으로 데이터를 저장하고 있는 뷰