뷰는 테이블이지만 실제 존재하지 않는 테이블이다.
데이터베이스 내에 존재하는 하나 이상의 테이블에서 사용자가 얻기 원하는 데이터들만을 정확하고 편하게 가져오기 위하여 사전에 원하는 컬럼들만을 모아서 만들어 놓은 가상의 테이블이다.
즉, 실제로 존재하는 테이블이 아니라 하나 이상의 테이블에서 파생된 또 다른 정보를 볼 수 있는 방법이며, 그 정보들을 추출해내는 SQL 문장이라고도 볼 수 있다.
CREATE VIEW [dbo].[uv_Member] AS SELECT A.user_id, A.user_name, A.group_code, B.group_name FROM TB_Member A LEFT JOIN (SELECT group_code, group_name FROM TB_Group)B ON A.group_code = B.group_code
이와 같이 하나 이상의 테이블에서 필요한 정보만을 골라 가상 테이블(uv_Member)을 만들어두면 매번 두개의 테이블에 접근하지 않아도 쉽고 빠르게 사용할 수 있다.
뷰의 수정은 CREATE 대신 ALTER를 쓴다는 점만 다르고 동일하다.
뷰의 삭제는 테이블 삭제와 유사하며 TABLE 대신 VIEW를 사용한다.
DROP VIEW [dbo].[uv_Member]
뷰를 제거할 때는 제거되는 뷰와 관련되는 항목들을 sp_depend 뷰이름을 사용하여 미리 연관딘 사항들을 체크해야한다.
뷰의 장점
첫째, 뷰는 사용자에게 편의성을 제공한다.
즉, 사용자가 원하는, 사용자에게 필요한 정보만을 사용자의 요구에 맞게 제공해준다.
뷰를 만들 때 테이블들과 컬럼들간의 복잡한 관계들을 미리 정의하여 놓기만 하면 일반 사용자들은 그 생성된 뷰를 마치 일반 테이블 다루듯이 쉽게 사용할 수 있다는 것이다.
둘째, 자주 사용되는 질의를 미리 정의해둠으로써 사용자가 작업을 실행할 때마다 여러 조건들을 지정해야만 하는 불편을 해소할 수 있다.
셋째, 데이터의 보안과 관련하여 특정 사용자에게 필요한 데이터를 선별적으로 보여줄 수 있다. 이것은 전체의 데이터를 관리하는 관리자에게 있어 어떤 특정한 사용자나 그룹에게 특정 데이터를 보여주고 싶지 않을 때 상당히 유용한 기능을 제공한다.
제약사항
주의사항
WITH ENCRYPTION 옵션
뷰의 오브젝트가 되는 테이블의 내부 구조를 보안 등의 이유로 감추기 위해 뷰를 사용했다면 뷰의 구조 역시 보여주고 싶지 않을 것이다.
이럴 때 주로 WITH ENCRYPTION을 사용한다.
이 옵션은 뷰의 정의를 syscomments 테이블에 암호화하여 저장하기 때문에 사용자들 뿐만 아니라 개발자 역시도 뷰의 내부 정의를 볼 수 없게 된다. 이와 같이 한번 암호화된 뷰는 다시 볼 수 있는 방법이 없기 대문에 이후에 있을지도 모를 수정에 대비하여 반드시 소스코드를 잘 보존해야 한다.
CREATE VIEW [dbo].[uv_Member] WITH ENCRYPTION AS SELECT A.user_id, A.user_name, A.group_code, B.group_name FROM TB_Member A LEFT JOIN (SELECT group_code, group_name FROM TB_Group)B ON A.group_code = B.group_code
WITH CHECK OPTION
뷰는 데이터를 업데이트하기 위한 목적보다는 검색을 편리하게 하기 위한 목적으로 사용된다.
하지만 뷰를 통하여 뷰에서 사용된 실제 테이블의 데이터를 수정할 수도 있다.
(실제 View가 수정되는 것은 아니고 뷰에서 사용된 테이블의 데이터가 변경되어 View에 수정 결과가 보여지는 것이다.)
이때 일정한 조건에 의해 만들어진 뷰에서의 데이터 추가나 수정/삭제가 있을 경우 뷰를 생성할 때와 동일한 조건을 적용시켜야 할 때 사용된다.
CREATE VIEW [dbo].[uv_Member] AS SELECT A.user_id, A.user_name, A.group_code, B.group_name FROM TB_Member A LEFT JOIN (SELECT group_code, group_name FROM TB_Group)B ON A.group_code = B.group_code WHERE b.group_name='admin' WITH CHECK OPTION
이와같이 '그룹명이 admin인 사용자들' 이라는 조건을 가진 뷰를 이용하여 admin이 아닌 데이터를 추가하거나 수정/삭제하려할 경우 정상 실행되기는 하지만 옳지는 않다.
이런 경우에 WITH CHECK OPTION을 사용하여 그룹을 group이 admin인 데이터만 추가/수정/삭제 할 수 있도록 동일한 조건을 만족할때만 하는 것이다.