[데이터베이스] #8 Views

October 04, 2023


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 BYHAVING절이 없을 것

뷰를 통해 수정시 문제점

이러한 제약 조건에도 INSERT/UPDATE시 발생하는 문제점이 있습니다.

어전에 예제로 쓴 D30Student 뷰의 경우, 학과 번호가 30인 학생들만 포함하는 뷰 입니다.

이때, 해당 뷰를 사용해서 학과 번호가 40인 학생을 INSERT한다면 STUDENT 테이블에는 값이 저장되지만, D30Student 뷰로는 INSERT의 결과를 확인할 수 없습니다.

해결 방법

  1. With check option

    뷰에 대한 갱신이나 삽입 연산을 실행할 때, 뷰의 정의 조건을 위반하면 실행이 거부

    즉, 뷰가 선택할 수 있는 튜플만을 삽입하거나 수정할 수 있음

CREATE VIEW D30Student(ID, Name, Dept, Grade)
AS
SELECT sid, sname, deptno, grade FROM STUDENT WHERE deptno = 30
WITH CHECK OPTION;
  1. With read only

    기본 테이블의 어떤 컬럼에 대해서도 뷰를 통한 내용 수정을 금지하는 옵션

    뷰를 통한 UPDATE 금지

ORA-42399 : 읽기 전용 뷰에서는 DML 작업을 수행할 수 없습니다.


Profile picture

이재원

이해하기 쉬운 코드를 작성하려 고민합니다.


© 2024 Won's blog Built with Gatsby