뷰는 테이블이지만 실제 존재하지 않는 테이블이다.

데이터베이스 내에 존재하는 하나 이상의 테이블에서 사용자가 얻기 원하는 데이터들만을 정확하고 편하게 가져오기 위하여 사전에 원하는 컬럼들만을 모아서 만들어 놓은 가상의 테이블이다.

즉, 실제로 존재하는 테이블이 아니라 하나 이상의 테이블에서 파생된 또 다른 정보를 볼 수 있는 방법이며, 그 정보들을 추출해내는 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 뷰이름을 사용하여 미리 연관딘 사항들을 체크해야한다.

 

뷰의 장점

첫째, 뷰는 사용자에게 편의성을 제공한다.

즉, 사용자가 원하는, 사용자에게 필요한 정보만을 사용자의 요구에 맞게 제공해준다.

뷰를 만들 때 테이블들과 컬럼들간의 복잡한 관계들을 미리 정의하여 놓기만 하면 일반 사용자들은 그 생성된 뷰를 마치 일반 테이블 다루듯이 쉽게 사용할 수 있다는 것이다.

 

둘째, 자주 사용되는 질의를 미리 정의해둠으로써 사용자가 작업을 실행할 때마다 여러 조건들을 지정해야만 하는 불편을 해소할 수 있다.

 

셋째, 데이터의 보안과 관련하여 특정 사용자에게 필요한 데이터를 선별적으로 보여줄 수 있다. 이것은 전체의 데이터를 관리하는 관리자에게 있어 어떤 특정한 사용자나 그룹에게 특정 데이터를 보여주고 싶지 않을 때 상당히 유용한 기능을 제공한다.

 

제약사항

  • 뷰의 사용자는 뷰의 정의에서 사용되는 개체들에 대한 SELECT 권한을 가지고 있어야만 한다.
  • 뷰의 정의에서 사용되는 SELECT문은 ORDER BY, INTO, COMPUTE, COMPUTE BY문을 사용할 수 없다.
  • 임시 테이블에 대해서는 뷰를 생성할 수 없다.
  • SELECT 하는 컬럼은 최대 1024개까지 지정할 수 있으며, 최대 250개의 컬럼을 참조할 수 있다.

주의사항

  • 해당 데이터베이스에 dbo 권한으로 로그인하여 생성함으로써 뒤에 소유주와 관련된 문제가 발생하는 것을 사전에 예방하는 것이 좋다.
  • 뷰를 만들기 위해 필요한 SQL 문장들을 먼저 작성하여 실행시켜 본 후, 올바른 결과가 나타나는지 먼저 확인해본다.
  • 위의 과정에서 문제가 없다면 만들어진 SQL문 앞에 CREATE VIEW 뷰이름 AS를 추가하여 생성한다.
  • 새롭게 생성된 뷰를 사용할 사용자들에 대해 적절한 사용권한을 준다. ( GRANT문 사용 )
  • 권한을 부여받은 사용자로 직접 로그인하여 뷰에서 결과를 가져오고 그것이 원하던 결과인지 확인한다.
  • 뷰를 정의한 후 그 뷰가 참조하는 테이블에 새로운 컬럼이 추가되는 경우 뷰에서 SELECT * 와 같이 컬럼을 지정하였더라도 새로 추가한 컬럼은 뷰에 나타나지 않는다. (뷰를 재정의해야함)
  • 뷰가 참조하는 테이블이 삭제되는 경우에도 뷰는 삭제되지 않으며, 다만 뷰 사용시 바인딩 오류가 발생한다. (테이블 삭제시 주의 필요)
  • 뷰는 가상 테이블이기는 하지만 사용법에 있어 일반 테이블과 다를 바가 없으므로 뷰가 일반 테이블과 혼동되어 사용되는 것을 방지하기 위해 구별이 가능한 다른 이름으로 사용하는 것이 좋다. 가령 TB_Member 테이블에서 파생된 뷰라면 uv_Member와 같이 이것이 뷰라는 것을 식별할 수 있게 네이밍해주는 것이 좋다.

 

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인 데이터만 추가/수정/삭제 할 수 있도록 동일한 조건을 만족할때만 하는 것이다.