View
Virtual table이라고도 말하며 데이터가 저장되지 않는 가상의 테이블입니다.
장점
- 데이터 접근 권한을 다루기 쉬움
- 쿼리 작성이 더 쉬움
- 테이블 이름이 바뀌는 경우, 전체를 바꾸는 것이 아닌 해당 뷰만 수정하면 됨
- 질의 연산에 제한없이 데이터 독립성 가능
단점
- 독립적인 인덱스를 가질 수 없음
ALTER VIEW
문을 사용 불가, 정의를 변경할 수 없음(대신 DBMS에 따라 가능한 경우도 있음)- 뷰로 구성된 내용에 대한 삽입, 삭제, 갱신, 연산에 제약이 따른다.
예시
학과 번호가 30인 학생들만 모은 뷰
- 생성
CREATE VIEW D30Student(ID, Name, Dept, Grade)
AS
SELECT sid, sname, deptno, grade
FROM STUDENT
WHERE deptno = 30;
- 검색
SELECT * FROM <뷰 이름>;
SELECT MAX(grade) FROM D30Student;
- 삭제
DROP VIEW <뷰 이름>;
뷰를 통한 데이터 변경
뷰에 아래 요소가 있는 경우 DELETE
가 불가능합니다.
JOIN
GROUP BY
DISTINCT
뷰에 아래 요소가 있는 경우 UPDATE
가 불가능합니다.
- 위의 아무 요소
- 수식이 포함된 컬럼 (e.g.
grade*100 / 4.5
)
뷰에 아래 요소가 있는 경우 INSERT
가 불가능합니다.
- 위의 아무 요소
NOT NULL
컬럼이 존재하는 경우
SQL View가 수정 가능한 조건
FROM
절에 하나의 릴레이션만 포함SELECT
절에는 속성 이름만 포함( 수식, 집계 함수, DISTINCT 없을 것 )SELECT
절에 없는 속성은 NULL로 설정 가능할 것 ( NOT NULL 조건이 컬럼에 없어야 함 )GROUP BY
나HAVING
절이 없을 것
뷰를 통해 수정시 문제점
이러한 제약 조건에도 INSERT
/UPDATE
시 발생하는 문제점이 있습니다.
어전에 예제로 쓴 D30Student
뷰의 경우, 학과 번호가 30인 학생들만 포함하는 뷰 입니다.
이때, 해당 뷰를 사용해서 학과 번호가 40인 학생을 INSERT
한다면 STUDENT
테이블에는 값이 저장되지만, D30Student
뷰로는 INSERT
의 결과를 확인할 수 없습니다.
해결 방법
-
With check option
뷰에 대한 갱신이나 삽입 연산을 실행할 때, 뷰의 정의 조건을 위반하면 실행이 거부됨
즉, 뷰가 선택할 수 있는 튜플만을 삽입하거나 수정할 수 있음
CREATE VIEW D30Student(ID, Name, Dept, Grade)
AS
SELECT sid, sname, deptno, grade FROM STUDENT WHERE deptno = 30
WITH CHECK OPTION;
-
With read only
기본 테이블의 어떤 컬럼에 대해서도 뷰를 통한 내용 수정을 금지하는 옵션
뷰를 통한
UPDATE
금지
ORA-42399 : 읽기 전용 뷰에서는 DML 작업을 수행할 수 없습니다.