뷰 테이블

호밀빵 굽는 쿼카·2023년 2월 25일
0

NHN Cloud

목록 보기
13/16

이전에 짧게 공부했던 뷰 테이블

1. 뷰 테이블이란?

  • 사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 기본 테이블로부터 유도된, 이름을 가지는 가상 테이블

뷰 테이블의 특징

  • 저장장치 내에 물리적으로 존재하지 않지만 사용자에게 있는 것처럼 간주
  • 기본 테이블과 같은 형태의 구조를 사용하며, 조작도 기본 테이블과 거의 같음
  • 뷰가 정의된 기본 테이블이나 뷰를 삭제하면 그 테이블이나 뷰를 기초로 정의된 다른 뷰도 자동으로 삭제됨
  • 데이터베이스는 유저가 쿼리할 때마다 view를 매번 recreate하기 때문에 view는 항상 최신의 데이터를 보여줌
  • CREATE VIEW 명령어로 뷰를 정의할 때 AS 절 다음에 등장하는 쿼리문 자체를 저장

뷰 테이블의 장점

  • 여러 테이블을 조인하는 길고 복잡한 쿼리문을 통해 데이터를 조회해야 하는 경우, 해당 쿼리문을 매번 작성하는 일은 번거로운 일 => 조인문의 사용 최소화로 사용상의 편의성을 최대화 = 필요한 데이터만 뷰로 정의해서 처리할 수 있기 때문에 관리가 용이하고 명령문이 간단 (주된 목적인듯)
  • 동일한 테이블에 접근하는 여러 다른 사용자들이 있다면 사용자들마다 서로 다른 뷰에 접근하도록 여러 뷰를 정의할 수 있음, 이를 통해 특정 사용자만 특정 뷰에 접근할 수 있도록 접근을 제한함으로써 보안을 높이는 것이 가능
  • 논리적 데이터 독립성을 제공 => ??

뷰 테이블의 단점

  • 뷰로 구성된 내용에 대한 삽입, 삭제, 갱신, 연산에 제약이 따른다.
  • ALTER VIEW문을 사용할 수 없음. 즉 뷰의 정의를 변경할 수 없음 => 뷰는 ALTER문을 사용하여 변경할 수 없으므로 필요한 경우는 삭제한 후 재생성
# 뷰 생성
CREATE VIEW 뷰이름[(속성이름[,속성이름])]AS SELECT문;

# 뷰 삭제
DROP VIEW 뷰이름 RESTRICT or CASCADE

RESTRICT : 뷰를 다른곳에서 참조하고 있으면 삭제가 취소된다.
CASCADE : 뷰를 참조하는 다른 뷰나 제약 조건까지 모두 삭제된다.

2. 큐브리드 뷰 테이블

큐브리드 중앙DB(C*****) 에도 뷰 테이블 존재 => 데이터를 효율적으로 관리하고 사용하기 위해

1) view table create

CREATE [OR REPLACE] {VIEW | VCLASS} view_name
[<subclass_definition>]
[(view_column_name, ...)]
[INHERIT <resolution>, ...]
[AS <select_statement>]
[WITH CHECK OPTION] ;

    <subclass_definition> ::= {UNDER | AS SUBCLASS OF} table_name, ...

    <resolution> ::= [CLASS] {column_name} OF superclass_name [AS alias]
  • OR REPLACE: 기존의 뷰를 새로운 뷰로 대체
  • view_name: 생성하려는 뷰의 이름을 지정
  • view_column_name: 생성하려는 뷰의 칼럼 이름을 지정
  • AS <select_statement>: 유효한 SELECT 문이 명시
  • WITH CHECK OPTION: 이 옵션이 명시되면 <select_statement> 내 WHERE 절에 명시된 조건식을 만족하는 경우에만 업데이트 또는 삽입이 가능하다. 조건식을 위반하는 가상 테이블에 대한 갱신을 허용하지 않기 위해서 사용한다.
CREATE TABLE a_tbl(
id INT NOT NULL,
phone VARCHAR(10));
INSERT INTO a_tbl VALUES(1,'111-1111'), (2,'222-2222'), (3, '333-3333'), (4, NULL), (5, NULL);


--creating a new view based on AS select_statement from a_tbl
CREATE VIEW b_view AS SELECT * FROM a_tbl WHERE phone IS NOT NULL WITH CHECK OPTION;
SELECT * FROM b_view;

           id  phone
===================================
            1  '111-1111'
            2  '222-2222'
            3  '333-3333'

# with check option 사용시 컬럼값 update 불가능
UPDATE b_view SET phone=NULL;
=> ERROR: Check option exception on view b_view.

# create or replace 사용시 기존의 뷰를 새로운 뷰로 대체
CREATE OR REPLACE VIEW b_view AS SELECT * FROM a_tbl ORDER BY id DESC;

SELECT * FROM b_view;
           id  phone
===================================
            5  NULL
            4  NULL
            3  '333-3333'
            2  '222-2222'
            1  '111-1111'

2) view table update

조건

  • 뷰에 정의된 칼럼이 업데이트 가능하더라도 FROM 구문에 포함된 테이블에 대해 업데이트를 위한 적절한 권한이 있어야 하며 뷰에 대한 접근 권한이 있어야 함
  • FROM 절은 반드시 업데이트 가능한 테이블이나 뷰만 포함해야 한다.
  • JOIN 구문을 포함 X
  • DISTINCT, UNIQUE 구문을 포함 X
  • GROUP BY ... HAVING 구문을 포함 X
  • SUM ( ), AVG ( )와 같은 집계 함수를 포함 X
  • CUBRID 9.0 미만 버전에서는 FROM 절에 업데이트 가능한 테이블을 포함할 경우 반드시 하나의 테이블만 포함해야 했다. 단, FROM (class_x, class_y)와 같이 괄호에 포함된 두 테이블은 하나의 테이블로 표현되므로 업데이트할 수 있었다. CUBRID 9.0 이상 버전에서는 업데이트 가능한 두 개 이상의 테이블을 허용한다.

3) view table alter

1> ADD QUERY 절

SELECT * FROM b_view;
           id  phone
===================================
            1  '111-1111'
            2  '222-2222'
            3  '333-3333'
            4  NULL
            5  NULL
            
ALTER VIEW b_view ADD QUERY SELECT * FROM a_tbl WHERE id IN (1,2);

SELECT * FROM b_view;
           id  phone
===================================
            1  '111-1111'
            2  '222-2222'
            3  '333-3333'
            4  NULL
            5  NULL
            1  '111-1111'
            2  '222-2222'

2> AS SELECT 절

  • CREATE OR REPLACE 문과 유사하게 동작
ALTER VIEW b_view AS SELECT * FROM a_tbl WHERE phone IS NOT NULL;

SELECT * FROM b_view;
           id  phone
===================================
            1  '111-1111'
            2  '222-2222'
            3  '333-3333'

3> CHANGE QUERY 절

ALTER VIEW b_view ADD QUERY SELECT * FROM a_tbl WHERE id IN (1,2);
ALTER VIEW b_view ADD QUERY SELECT * FROM a_tbl WHERE id = 3;

SELECT * FROM b_view;
           id  phone
===================================
            1  '111-1111'
            2  '222-2222'
            3  '333-3333'
            4  NULL
            5  NULL
            1  '111-1111'
            2  '222-2222'
            3  '333-3333'

ALTER VIEW b_view CHANGE QUERY 2 SELECT * FROM a_tbl WHERE phone IS NULL;

SELECT * FROM b_view;
           id  phone
===================================
            1  '111-1111'
            2  '222-2222'
            3  '333-3333'
            4  NULL
            5  NULL
            4  NULL
            5  NULL
            3  '333-3333'

4) view table drop

DROP VIEW b_view;

5) view table rename

RENAME VIEW game_2004 AS info_2004;




참고링크

profile
열심히 굽고 있어요🍞

0개의 댓글