DB모델링

내가 보려고 정리한 오라클SQL_오라클객체_VIEW

비비펄 2022. 11. 30. 12:07

📌VIEW

  - 테이블과 유사한 객체(가상의 테이블)--그래서 FROM절에서 사용 가능
  - SELECT문의 결과 집합
  - 테이블과는 독립적으로 사용됨
  - VIEW는 
                . 필요한 정보가 여러 테이블에 분산되어 있는 경우
                . 특정자료의 접근을 제어하는 경우

 

✔사용형식

 CREATE [OR REPLACE] VIEW 뷰이름[(컬럼list)] 
 AS
   SELECT 문;
   [WITH READ ONLY]
   [WITH CHECK OPTION]

 .'(컬럼list)': 뷰에서 사용할 컬럼명. 생략하면 SELECT문의 컬럼 별칭이 뷰의 컬럼명이되고,
                    SELECT문의 컬럼 별칭이 없는 경우 SELECT문의 컬럼명이 뷰의 컬럼명이 됨

 

  .'OR REPLACE':  '뷰이름'이 이미 존재하면 대치시키고 없으면 신규로 생성

                              (생성된 뷰이면 덮어쓰고/생성안된 뷰이면 생성함)

 

  .'WITH READ ONLY'읽기전용 뷰 생성. 뷰를 대상으로 DML명령을 수행시킬 수 없음. 

다만 원본테이블은 제한없이 DML명령 사용할수 있으며, 원본테이블에서 변경사항은 즉시 뷰에 반영(변경금지)

 

  .'WITH CHECK OPTION': 원본 SELECT 문의 WHERE 조건을 위배하는 값으로 뷰의 내용을 변경하는 DML명령을 사용할 수 있으며, (조건에 따라 뷰를 수정할 수 있음->뷰를 수정하면 원본테이블 데이터도 수정)원본테이블에서 변경사항은 즉시 뷰에 반영(변경가능)

 

  .따라서 'WITH READ ONLY'와 'WITH CHECK OPTION'는 둘다 쓸 수 없다.

 

 

뷰 삭제

  DROP VIEW MEM_MILE_V1
  DROP VIEW [뷰이름]
❗사용예::
회원테이블에서 마일리지가 3000이상인 회원의 회원번호,회원명,마일리지로 뷰를 생성하시오

  CREATE OR REPLACE VIEW MEM_MILE_V1(MID,MNAME,MILEAGE)
  AS
    SELECT MEM_ID,MEM_NAME,MEM_MILEAGE
      FROM MEMBER
     WHERE MEM_MILEAGE>=3000;
**(원본테이블 내용이 변경)
     회원테이블에서 'E001'회원의 마일리지를 4000으로 변경하시오
     UPDATE MEMBER
        SET MEM_MILEAGE = 4000
      WHERE MEM_ID = 'e001';
      
      
  **(뷰의 내용이 변경)
     회원테이블에서 'x001'회원의 마일리지를 9791에서 2000으로 변경하시오
     UPDATE MEM_MILE_V1
        SET MILEAGE = 2000
      WHERE MID = 'x001';​
      SELECT*FROM MEM_MILE_V1; --뷰내용 확인
      SELECT MEM_ID,MEM_MILEAGE FROM MEMBER;--원본테이블 내용 확인

 

 

WITH READ ONLY
❗사용예::
WITH READ ONLY 뷰생성
   CREATE OR REPLACE VIEW MEM_MILE_V2
  AS
    SELECT MEM_ID,
           MEM_NAME,
           MEM_MILEAGE
      FROM CUSTOMERS
     WHERE MEM_MILEAGE>=3000
     WITH READ ONLY;​
reda only view에서는 자료를 삭제할 수 없다는 오류가 뜸
p001이 삭제됨

 

 

WITH CHECK OPTION
❗사용예::
WITH CHECK OPTION 뷰생성
CREATE OR REPLACE VIEW MEM_MILE_V3
  AS
    SELECT MEM_ID AS 회원번호,
           MEM_NAME AS 회원명,
           MEM_MILEAGE AS 마일리지
      FROM CUSTOMERS
     WHERE MEM_MILEAGE>=3000
     WITH CHECK OPTION;​