본문 바로가기

데이터베이스/SQL & PL/SQL

[SQL] 뷰를 사용합시다, VIEW!


 지금까지 많은 객체(Object)들을 보아왔는데요, 최근에는 시퀀스였습니다.
 사실 뷰를 먼저 봤어야 하는데, 흥미위주로 복습을 하는지라 글 순서가 이리 되었네요.

 뷰는 '보안'에 의미에 무게를 둔 '돋보기' 기능이라 비유해도 될까요?
 
 뷰(View)를 통해서 데이터를 조회해 볼 수 있는데요. SELECT처럼 보고싶은 내용을 선택해서 볼 수 있는게 아니라,
제한적으로 보여지게 됩니다. 무슨말이냐 하면 뷰는, 실제 데이터를 담고 있는 테이블을 간접적으로 볼 수 있게 합니다.

 만일에 인사직원 중에 월급을 관리하는 직원들이 있다고 합시다. 그런데 그 담당직원에 대해서 SELECT 권한을 주게 되어버리면
그 사원에게는 필요없는 정보까지 모두 보여질 수 있습니다. 보안상으로도 문제가 있구요.

 여기에서, 등장하는 것이 뷰입니다.
이 월급 담당직원에게 사원들의 사원번호와, 이름, 월급 정보만 보여주자고 할때, 뷰에 이러한 컬럼들만 배정하고,
그 사원이 뷰를 사용할 수 있도록 하면, 위에서 말한 걱정거리는 없어집니다.

 뷰는 테이블을 조회하는 SELECT 문장을 통해서 만들어지는데요, 위에서 말한 간접적으로 데이터를 볼수 있다는 것이 이 의미에 부합합니다.
테이블처럼, 데이터를 담고 있으나 실제로는 존재 하지 않는 것이지요. 단지 보여줄 뿐입니다. 그래서 뷰를 가상 테이블이라고도 한답니다.

 뷰의 생성은 다음과 같이 합니다. 객체이기 때문에, CREATE 문을 씁니다.
SQL> CREATE VIEW 스키마.뷰명 
         AS SELECT 쿼리;

 CREATE와 VIEW사이에 'OR REPLACE' 라는 키워드를 적어줄 수 있는데요. 뷰를 만들때 동일한 뷰가 존재하면.. 일종의 '덮어쓰기'라고 생각하시면 됩니다.

위에서 말한 월급 담당자에게 건네줄 뷰는 다음과 같겠습니다.
SQL > CREATE VIEW hr.salaryview
          AS SELECT employee_id, last_name, first_name, salary
               FROM hr.employees;


[실행화면]



 그렇다면 전에 만들어 놓은 test계정으로 한번 뷰를 확인해 보도록 하겠습니다.

[실행화면]



 자, 테이블이나 뷰가 존재하지 않는다고 에러메시지가 나옵니다. 맞습니다. 권한이 없기 때문이죠!
하나의 객체이기 때문에 권한이 필요합니다. 다음과 같이 권한을 부여합니다.

[실행화면]



 무사히 권한을 주었구요. 조회를 해보겠습니다. 다음은 iSQL PLUS에서 test 계정으로 접속해 조회한 결과입니다.

-전체결과의 일부입니다.

 뷰를 조회했더니 위에서 뷰를 만들때 넣어줬던 SELECT의 쿼리에서 조회한 컬럼들만 보이는 군요.
뷰에서는 employees 테이블에 관해서 다른 컬럼에 대해서는 조회가 불가능 합니다. 왜 뷰가 보안상 좋은지 알겠지요?

 그리고 제가 오브젝트 권한 글에서 정리를 할때 뷰는 인덱스와 ALTER 권한이 없다고 했는데요. 그렇다면 뷰는 그것들을 제외한,
나머지 DELETE, INSERT, UPDATE 권한을 쓸 수 있다는 말이 됩니다.

 한가지 주의해야 할건 이겁니다. 실제 데이터가 담겨있는 곳은 뷰가 아니라 테이블이라는 점.
그래서 INSERT를 할때는 제약조건(Constraint) 중 NOT  NULL 조건을 꼭 지켜야 하는데,
실제 해당 테이블인 hr.employees에 속한 컬럼들에는 5개의 NOT NULL 컬럼이 존재합니다.


하지만 제가 만든 뷰에는 저러한 NOT NULL 제약조건을 포함한 컬럼들이 쓰여져 있지 않으므로 INSERT 작업이 되지 않습니다.
뷰가 가지고 있는 컬럼들만 INSERT 를 시도하게 되면 실제 테이블의 다른 컬럼들에 대해서는 NULL 값이 적용되기 때문이죠.

 하지만 DELETE와 UPDATE는 가능합니다. 

 관리자 계정 입장에서 이러한 뷰를 통한 데이터의 갱신이 이루어지지 않게 하려면 뷰를 만들시에
CREATE 문 마지막에 WITH READ ONLY 옵션을 추가해주면 읽기전용으로 뷰를 만드는게 가능합니다. 
이러한 뷰를 READ-ONLY 뷰라하고 반대로 위와 같이 수정 가능한 뷰를 UPDATABLE 뷰라고 합니다.
 
 그리고 다른 옵션 중에 WITH CHECK OPTION 라는 것이 있는데, 뷰 생성시에 AS 뒤에 정의한 SELECT문의 쿼리 한도내에서만
INSERT가 가능하도록 하는 옵션
입니다.
 설명을 하자면, 제가 WHERE절을 통해서 뷰가 부서번호가 100, 110만 조회가능하도록 뷰를 만들었다면,
INSERT할때 부서 아이디가 100과 110 부서인 사원들만 입력이 가능하다는 것입니다.
부서번호가 90번인 사원을 뷰를 통해서 INSERT를 하려하면 에러가 나옵니다.

 이렇게 해서 글을 마칠까 합니다. 다음번에 제가 복습할 때는 좀더 알차고 빠진내용을 추가해서 글을 쓰도록 하겠습니다.

도움 되셨다면 밑의 추천(손가락 표시)과 댓글 부탁드립니다.