View 는 하나의 가상 테이블이다. 잘 정의된 Relation Architecture 를 가지는 경우에 굳이 왜 View 를 쓰는걸까?
View 는 보통 복잡한 쿼리를 간단하고 가시적이게 만들 수 있으며 민감한 데이터에 접근하는 것을 제한하는 방법을 제공하기 때문에 더 나은 Database 접근과 조회를 제공 할 수 있다.
View 테이블은 실제하는가?
View 테이블은 Named, Drived, Virtual Table 이다. 명명된, 유도된 가상 테이블인데 Create View ... 을 통해서 정의 할 수 있다.
실제로 Create View ... 를 한다고 table 이 생성되는 것이 아니고 테이블의 정의문이 System Catalog(Schema)에 저장된다.
그렇다면 View 의 실제 동작은?
만약 view 의 정의가 하단과 같을 때,
Create View goot_suppliers as
select sno, city
from s
where status > 15;
실제로 select ... 은 실행되지 않고 schema 에 저장된다.
여기서 view table 은 real table에 대한 window 효과를 제공하는데 view 는 base table 의 내용이 변경되면 view 에서도 확인 가능하므로 window 는 Dynamic 하다
이렇게 만들어진 View table 에 대해 다시 Select 문을 적용 할 수 있다.
select *
from good_supplier
where city != 'London';
사실 잘 생각해보면 good_supplier 안의 select 문 결과에 그냥 and 한 것과 같다는 걸 알 수 있다.
select *
from (
select sno, status, city
from s
where status > 15
) and city != 'London';
그렇다면 View 의 내용을 재정의 하고 싶다면 어떻게 해야 할까?
alter view good_supplier as select sno, city from s where status > 15;
View 를 제거하고 싶을 때는?
drop view if exists good_supplier;
View 를 사용하는 이유는?
- 논리적 데이터 독립성 지원
- Conceptual Schema 가 변경되어도 External Schema 가 변경되지 않는것.
- 응용 프로그램이 변경되지 않음
- Base Table 의 변경 종류
- Growth : base table 에 새로운 columns 이 추가
- Reconstructing : base table 을 split, join 하는 경우
- 복잡한 JOIN 처리를 View 테이블로 미리 정의하여 간단한 Select 문 사용 가능
- 민감 데이터는 View 의 조건으로 접근을 제한
View 테이블에 Insert 를 할려면?
insert into good_supplier values(‘s10’,100,’Busan’);
view 에 대한 insert 는 base table 에 대한 insert 로 처리되게 된다.
하지만 view table 에서는 새로 insert 된 레코드가 view 의 조건을 만족하지 않을수도 있다. 이때는 view 에서는 새로 삽입된 record 가 보이지 않는다.
이런 경우처럼 insert 하고자 하는 record 가 view 조건을 만족하지 않는 경우 base table 에도 insert 되지 않게 하기 위해서는,
create view bad_supplier as
select sno, status, city from s where status < 10 with check option;
with check option; 을 사용해 view 정의 단계에서 미리 처리한다.
물론 insert 할 때 view 가 base table 의 PK 를 포함하고 있어야 가능하다.
이는 JOIN view 에 대한 경우에도 마찬가지로,
create view ssp as select * from s join sp on s.sno=sp.sno;
select * from ssp;
insert into ssp values(‘s1’,’Hong’,10,’Busan’,’p1,10);
insert into ssp values(‘s11’,’Hong’,10,’Busan’,’p11,10);
위는 1:N 관계에 대한 join view 의 insert 구문이다.
view 의 update 는 view 의 레코드와 base table 의 record 가 반드시 1:1 대응관계일때만 가능하다.