본문 바로가기

CS/데이터베이스

[데이터베이스 기초] SQL의 VIEW 정리

View

가상 테이블이다. 실제 있는 테이블이 아니라 마치 있는 것처럼 보이는 테이블을 뷰라고 한다.

굳이 뷰를 만들지 않고 별도의 테이블을 만들면 안되나?

학생 테이블의 일부를 뷰 대신 별도의 테이블로 만든다면 데이터의 중복이 발생하는 문제가 생긴다.

 

* 검색 쿼리는 문제 없지만 업데이트 연산에 제약이 있다

 

CREATE VIEW COM_STUDENT(Sno, Sname, Year)
AS SELECT Sno, Sname, Year
   FROM STUDENT
   WHERE Dept = '컴퓨터';

VIEW를 정의하면서 SLECT 절과 COM_STUDENT (Sno, Sname, Year) 의 내용이 같다면 (Sno, Sname, Year)는 생략 가능하다.

 

ProjectX에서 일하는 모든 직원의 Lname과 Fname을 검색하라

CREATE VIEW WORKS_ON1
AS SELECT Fname, Lname, Pname, Hours
   FROM EMPLOYEE, PROJECT, WORKS_ON
   WHERE Ssn=Essn AND Pno=Pnumber;
   
SELECT Fname, Lname
FROM WORKS_ON1
WHERE Pname='ProjectX';

-> 뷰가 있다면 쿼리 자체를 간단하게 표현할 수 있다.

-> 보안과 권한 매커니즘을 사용할 수 있다.

(뷰를 정의해서 제공한다면 유저들은 제공받은 데이터가 가상 테이블인지 실제 테이블인 지 알 수 없음, 개인정보가 있는지 조차 알 수 없음)

 

View 삭제

DROP VIEW WORKS_ON1;

테이블을 삭제하면 관련된 뷰도 함께 삭제된다. (CASCADE OPTION)

 

DBMS가 VIEW를 지원하는 방법

1. Query Modification:

유저가 뷰에 대해 쿼리를 던지면 뷰 정의를 이용해서 원래 테이블에 대한 쿼리로 변경한다. 실제 수행되는 것은 원래 복잡한 쿼리가 실행된다. -> 유저는 간단히 표현하지만 실제 실행은 뒤의 복잡한 쿼리가 실행. 성능면에서의 장점이 하나도 없다.

 

2. View Materialization:

위의 문제를 해결한 방법으로 임시 뷰 테이블을 정의해두었다가, 뷰에 대한 첫 번째 쿼리가 수행될 때 베이스 테이블에서 연산을 수행하고 수행된 결과를 저장해 둔다. 다음에 다시 이 뷰에 대한 쿼리가 오면 베이스 테이블에서 수행되는 것이 아닌 저장된 임시 뷰 테이블로부터 연산이 수행된다. base table이 업데이트되면 임시 뷰 테이블 내용도 수정되어야 한다. 뷰에 flag를 하나 두고 사용할 수 있는 뷰인지 아닌지 판별해야 한다. 사용하지 못할 경우 다시 새로운 뷰를 만들어 준다. 만약 base table에 업데이트가 자주 일어난다면 성능 상 문제가 생긴다.

 

3. Incremental Update(점진적 갱신 방법) :

위에 문제를 해결한 방법으로 베이스 테이블에 업데이트가 일어나면 뷰에도 똑같이 업데이트를 해주는 방식이다. 뷰가 새로 만들어지는 일이 없다. 뷰가 일정 시간 만큼 사용되지 않는다면 자동적으로 삭제된다.

 

View Update

집단 함수가 없는 싱글 테이블에서의 뷰는 업데이트를 지원한다.

Column subset view (몇개의 컬럼만 뽑아내서 만든 뷰)는 pk를 포함하고 있다면 완전한 연산이 가능함. 없다면 insert 불가능

Row subset view(조건에 맞는 몇개의 행만 뽑아서 만든 뷰)는 완전한 연산 가능

Join view는 업데이트를 허용하지 않는다. -> 어떤 테이블에 데이터를 업데이트해야 할지 알 수 없음. (모호성이 존재)

 

업데이트한 결과가 뷰 정의에 위배된다면? WITH CHECK OPTION을 사용한다.

CREATE VIEW EMP_D5
AS SELECT * FROM EMPLOYEE WHERE Dno=5
WITH CHECK OPTION;

WITH CHECK OPTION 을 사용하면 뷰 정의에 위배되는 연산은 거부된다.

 

GRANT와 REVOKE 

GRANT는 권한을 주는 명령어, REVOKE는 권한을 뺏는 명령어

테이블의 일부만 제한해서 볼 수 있도록 할 때 뷰를 정의해서 GRANT를 주면 쉽게 정의할 수 있다.