뷰 디자인 및 구현

뷰를 만들기 전에 다음 지침을 고려하십시오.

  • 현재 데이터베이스에서만 뷰를 만들 수 있습니다. 그러나 분산 쿼리를 사용하여 뷰를 정의하면 새 뷰에서 참조하는 테이블 및 뷰가 다른 데이터베이스 또는 다른 서버에 존재할 수 있습니다.

  • 뷰 이름은 식별자 규칙을 따라야 하며 각 스키마에 대해 고유해야 합니다. 또한 뷰 이름과 해당 스키마에 포함된 테이블의 이름이 같을 수 없습니다.

  • 다른 뷰에 대한 뷰를 작성할 수 있으며 MicrosoftSQL Server에서는 뷰를 중첩할 수 있습니다. 중첩은 32 수준을 넘을 수 없습니다. 뷰 중첩에 대한 실제 제한은 뷰의 복잡성과 사용 가능한 메모리의 양에 따라 보다 낮을 수 있습니다.

  • 규칙 또는 DEFAULT 정의를 뷰에서 사용할 수 없습니다.

  • AFTER 트리거를 뷰에서 사용할 수 없습니다. INSTEAD OF 트리거만 사용할 수 있습니다.

  • 뷰를 정의하는 쿼리에는 COMPUTE 절, COMPUTE BY 절 또는 INTO 키워드를 포함할 수 없습니다.

  • 뷰를 정의하는 쿼리에는 SELECT 문의 선택 목록에 TOP 절도 함께 있는 경우를 제외하고는 ORDER BY 절을 포함할 수 없습니다.

  • 뷰를 정의하는 쿼리에는 쿼리 힌트를 지정하는 OPTION 절을 포함할 수 없습니다.

  • 뷰를 정의하는 쿼리에는 TABLESAMPLE 절을 포함할 수 없습니다.

  • 뷰에서 전체 텍스트 인덱스 정의를 정의할 수 없습니다.

  • 임시 뷰를 만들 수 없으며 임시 테이블에서 뷰를 만들 수 없습니다.

  • SCHEMABINDING 절로 생성된 뷰에서 사용하는 뷰, 테이블 또는 함수는 뷰가 삭제되거나 변경되어 스키마 바인딩이 더 이상 존재하지 않는 경우에만 삭제할 수 있습니다. 또한 ALTER TABLE 문을 스키마 바인딩이 있는 뷰에 참여하는 테이블에 대해 사용할 때 이 문에 뷰 정의에 영향을 미친다면 문이 실패합니다.

  • SCHEMABINDING 절을 사용하여 뷰를 만들지 않은 경우 뷰의 기반이 되는 개체에 대한 변경 내용이 뷰의 정의에 영향을 주면 sp_refreshview를 실행해야 합니다. 그렇지 않으면 뷰를 쿼리할 때 예기치 않은 결과가 발생할 수 있습니다.

  • 쿼리에서 전체 텍스트 인덱싱을 위해 구성된 테이블을 참조하면 뷰 정의에 전체 텍스트 쿼리를 포함할 수 있어도 뷰에 대해 전체 텍스트 쿼리를 사용할 수 없습니다.

  • 다음과 같은 경우는 뷰에서 모든 열의 이름을 지정해야 합니다.

    • 뷰에 있는 모든 열이 산술 식, 기본 제공 함수 또는 상수에서 파생되는 경우입니다.

    • 뷰 정의가 조인을 포함하고 둘 이상의 다른 테이블로부터 가져온 열의 이름이 같아서 뷰에 있는 둘 이상의 열이 같은 이름을 갖게 되는 경우입니다.

    • 뷰가 파생된 열의 이름과 다른 뷰 열 이름을 지정하려 하는 경우입니다. 뷰 열 이름을 바꾸는 경우도 마찬가지입니다. 뷰 열은 이름을 바꾸는지 여부에 상관없이 자신이 파생된 열의 데이터 형식을 상속합니다.

      [!참고]

      뷰가 외부 조인이 포함된 쿼리에 기반하면 열에서 Null 값을 허용하지 않다가 허용할 수 있으므로 이 규칙이 적용되지 않습니다.

      그 외의 경우에는 뷰를 만들 때 열 이름을 지정할 필요가 없습니다. SQL Server에서는 뷰를 정의하는 쿼리가 참조하는 열과 같은 이름과 데이터 형식이 뷰의 열에 제공됩니다. SELECT 목록은 기본 테이블에 있는 열 이름의 전체 또는 부분 목록이 될 수 있습니다.

뷰를 만들려면 뷰를 만들 수 있는 권한을 데이터베이스 소유자로부터 받아야 하며 SCHEMABINDING 절을 사용하여 뷰를 생성하는 경우 뷰 정의에서 참조하는 테이블 또는 뷰에 대해 적절한 사용 권한이 있어야 합니다.

기본적으로 뷰를 통해 행을 추가하고 업데이트할 때 행이 뷰를 정의하는 쿼리의 기준에 맞지 않으면 뷰 범위에서 사라집니다. 예를 들어 직원의 급여가 $30,000 미만인 테이블에서 모든 행을 검색하는 뷰를 정의하면 쿼리가 생성될 수 있습니다. 직원의 급여가 $32,000로 인상되면 특정 직원의 급여가 뷰에서 설정된 기준을 따르지 않으므로 뷰를 쿼리해도 해당 직원이 더 이상 표시되지 않습니다. 그러나 WITH CHECK OPTION 절을 사용하면 뷰에 대해 실행되는 모든 데이터 수정 문이 뷰를 정의하는 SELECT 문에서 설정한 기준에 따르게 됩니다. 이 절을 사용하면 행이 뷰에서 사라지도록 행을 수정할 수 없습니다. 행이 뷰에서 사라지도록 행을 수정하려고 하면 수정이 취소되고 오류가 표시됩니다.

뷰를 만들려면