VIEW

조수경·2021년 10월 28일
0

Oracle

목록 보기
12/19

VIEW 객체

  • 테이블과 유사한 객체
  • SELECT 문의 실행결과 집합(가상의 테이블)
  • 필요한 정보가 여러 테이블에 분산되어 있고 해정 정보를 추출하는 쿼리가 자주 사용되는 경우
  • 테이블의 컬럼 중 일부 컬럼만 추출이 필요한 경우
  • 특정자료의 접근은 제한하고 결과만 제공하고자 하는 경우(보안)
  • 뷰가 업데이트 되면 원본도 업데이트 됨
    (사용형식)
    CREATE [OR REPLACE][FORCE|NOFORCE] VIEW 뷰이름[(컬럼list)]
    AS
    SELECT 문
    [WITH CHECK OPTION][WITH READ ONLY]; . REPLACE : 이미 같은 이름의 뷰가 존재하면 대치
    . FORCE : 기준 테이블이 없어도 뷰생성, 기본은 NOFORCE
    . 컬럼list: 뷰에서 사용할 컬럼명(생략하면 SELECT문의 컬럼별칭이 뷰의 컬럼명이 되고, 컬럼 별칭이 없는 경우 SELECT문의 컬럼명이 뷰의 )
    . WITH CHECK OPTION: SELECT 문의 WHERE절 조건을 위배하는 뷰에대한 DML 명령은 수행될 수 없음(오류)/원본 테이블의 SELECT절의 조건 WHERE을 위배
    . WITH READ ONLY : 읽기전용 뷰 / 변경 금지
    -- WITH CHECK OPTION와 WITH READ ONLY 는 동시 사용 불가
    **뷰에 대한 DML 명령이 제한되더라도 원본테이블에 대한 DML명령은 제한없이 사용되고 그 결과는 뷰에 즉시 반영됨 사용예) 회원테이블에서 마일리지가 10000을 넘는 회원의 회원번호, 회원명, 마일리지, 직업을 조회하여 그 결과를 뷰로 저장하시오
    CREATE OR REPLACE VIEW V_MEM_MILE(MID,MNAME,MILEAGE,MJOB)
    AS
    SELECT MEM_ID AS 회원번호,
    MEM_NAME AS 회원명,
    MEM_MILEAGE AS 마일리지,
    MEM_JOB AS 직업
    FROM MEMBER
    WHERE MEM_MILEAGE >= 10000; SELECT * FROM V_MEM_MILE; CREATE OR REPLACE VIEW V_MEM_MILE -- 먼저 생성한 것 덮어 쓰기: 셀렉 컬럼명의 별칭이 뷰의 컬럼명이 됨
    AS
    SELECT MEM_ID AS 회원번호,
    MEM_NAME AS 회원명,
    MEM_MILEAGE AS 마일리지,
    MEM_JOB AS 직업
    FROM MEMBER
    WHERE MEM_MILEAGE >= 10000;
    SELECT * FROM V_MEM_MILE;
    
    CREATE OR REPLACE VIEW V_MEM_MILE -- 먼저 생성한 것 덮어 쓰기: 셀렉 컬럼명의 별칭이 뷰의 컬럼명이 됨
    AS 
    SELECT MEM_ID , MEM_NAME , MEM_DELETE, MEM_JOB
      FROM MEMBER
     WHERE MEM_MILEAGE >= 10000;
    
    SELECT * FROM V_MEM_MILE;
    사용예) 생성된 뷰(V_MEM_MILE)에서 'b001'회원의 마일리지를 5000으로 변경하시오
    UPDATE V_MEM_MILE
    SET MEM_MILEAGE = 5000
    WHERE MEM_ID = 'b001'; 사용예) 회원테이블에서 'b001'회원의 마일리지를 15000으로 변경하시오
    UPDATE MEMBER
    SET MEM_MILEAGE = 15000
    WHERE MEM_ID = 'b001';
    --뷰를 변경하면 원본이 원본을 변경하면 뷰가 변경됨 사용예) 회원테이블에서 마일리지가 20000이상인 회원의 회원번호, 회원명, 마일리지, 연락처(핸드폰번호)로 읽기전용 뷰를 생성하시오 CREATE OR REPLACE VIEW V_MEM_MILE02
    AS
    SELECT MEM_ID AS 회원번호,
    MEM_NAME AS 회원명,
    MEM_MILEAGE AS 마일리지,
    MEM_HP AS 핸드폰번호
    FROM MEMBER
    WHERE MEM_MILEAGE >= 20000;
    CREATE OR REPLACE VIEW V_MEM_MILE02
    AS
    SELECT MEM_ID AS 회원번호,
    MEM_NAME AS 회원명,
    MEM_MILEAGE AS 마일리지,
    MEM_HP AS 핸드폰번호
    FROM MEMBER
    WHERE MEM_MILEAGE >= 20000
    WITH READ ONLY; 사용예) 뷰 V_MEM_MILE02에서 'r001'회원을 삭제하시오
    DELETE V_MEM_MILE02
    WHERE 회원번호 = 'r001'; --에러
    사용예)MEMBER 테이블에서 'r001'회원을 삭제하시오
        DELETE MEMBER
         WHERE MEM_ID = 'r001'; -- 이미 사용되고 있어서 삭제 불가 
    
    사용예)MEMBER 테이블에서 'r001'회원을 갱신하시오
        UPDATE MEMBER
          SET MEM_MILEAGE = 30000
         WHERE MEM_ID = 'r001'; -- 갱신은 가능(대상이 원본 테이블이기 때문에 뷰하고는 아무 제한이 없음) 
    
    SELECT * FROM V_MEM_MILE02; --원본 테이블도 변경
    사용예) 사원테이블에서 급여가 3000이하인 사원의 사원번호, 사원명, 부서명, 직책명을 WITH CHECK OPTION 뷰로 생성하시오
          CREATE OR REPLACE VIEW V_EMP_SAL
          AS 
            SELECT A.EMPLOYEE_ID, 
                   A.EMP_NAME, 
                   B.DEPARTMENT_NAME, 
                   A.SALARY,
                   C.JOB_TITLE
             FROM HR.EMP A, HR.DEPT B, HR.JOBS C
            WHERE A.DEPARTMENT_ID = B.DEPARTMENT_ID
              AND A.JOB_ID = C.JOB_ID
              AND A.SALARY<=3000
             WITH CHECK OPTION; 
    사용예) 뷰 V_EMP_SAL에서 사원번호 130번 사원의 급여를 3100으로 변경하시오
    -- 3000이하인 사람만 모아놨는데 3000보다 높은 값을 받는 사람을 갱신해서 오류가남 / 하지만 뷰라서 그럼 원본 테이블은 아무 상관 없음 UPDATE V_EMP_SAL
    SET SALARY = 3100
    WHERE EMPLOYEE_ID=130; UPDATE EMP
    SET SALARY = 3100
    WHERE EMPLOYEE_ID=130; SELECT * FROM V_EMP_SAL;
profile
신입 개발자 입니다!!!

0개의 댓글