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
물리적뷰 -빅데이터에 사용
실제 물리적으로 데이터를 저장하고 있는 뷰