개요 보기

이 주제에서는 Spanner 뷰를 소개하고 설명합니다.

개요

는 SQL 쿼리로 정의하는 가상 테이블입니다. 뷰를 만들 때는 뷰가 나타내는 SQL 쿼리를 지정합니다. 뷰를 만든 후에는 테이블을 참조하는 것처럼 뷰를 참조하는 쿼리를 실행할 수 있습니다.

뷰를 참조하는 쿼리가 실행되면 Spanner에서 뷰에 정의된 쿼리를 실행하여 가상 테이블을 만들고 참조 쿼리에서 해당 가상 테이블의 콘텐츠를 사용합니다.

뷰를 정의하는 쿼리는 뷰를 참조하는 쿼리가 실행될 때마다 실행되므로, 뷰를 논리적 뷰 또는 동적 뷰라고 부르기도 합니다. 이는 데이터 스토리지의 실제 테이블로 뷰를 정의하는 쿼리 결과를 저장하는 SQL 구체화 뷰와 구분하기 위함입니다.

Spanner에서는 뷰를 호출자의 권한 뷰 또는 정의자의 권한 뷰로 만들 수 있습니다. 이는 사용자의 뷰에 대한 액세스를 제어하는 두 가지 유형의 보안 모델입니다.

호출자의 권한 뷰정의자의 권한 뷰
설명 호출자 권한으로 뷰를 만드는 경우 데이터베이스 역할에 뷰 및 뷰에서 해당 뷰를 쿼리하기 위해 참조하는 모든 스키마 객체에 대한 권한이 필요합니다. 자세한 내용은 호출자의 권한 뷰를 참조하세요. 정의자의 권한으로 뷰를 만드는 경우 뷰를 쿼리하려면 데이터베이스 역할에 뷰(뷰만)에 대한 권한이 필요합니다. 정의자의 권한 뷰와 함께 세분화된 액세스 제어를 사용합니다. 그렇지 않으면 정의자의 권한 뷰에 액세스 제어가 추가되지 않습니다. 자세한 내용은 정의자의 권한 뷰를 참조하세요.
뷰를 만드는 데 필요한 권한 각 뷰 유형에 대한 액세스 권한을 생성, 부여, 취소하려면 데이터베이스 수준 spanner.database.updateDdl 권한이 있어야 합니다.
뷰를 쿼리하는 데 필요한 권한 데이터베이스 역할에는 뷰와 해당 뷰를 쿼리하기 위한 모든 기본 스키마 객체에 대한 권한이 필요합니다. 뷰를 쿼리하려면 데이터베이스 역할에 해당 뷰(뷰만)에 대한 권한이 필요합니다.

뷰의 이점

뷰는 애플리케이션 논리에 정의하는 쿼리를 포함한 여러 가지 이점을 제공합니다.

  • 뷰는 애플리케이션에 논리적 데이터 모델링을 제공할 수 있습니다.

    Spanner에서 물리적 데이터 모델링에 적합한 선택은 해당 데이터를 읽는 애플리케이션을 위한 최상의 추상화가 아닌 경우도 있습니다. 뷰는 애플리케이션에 더 적합한 추상화인 대체 테이블 스키마를 제공할 수 있습니다.

  • 뷰는 쿼리 정의를 중앙화하여 유지보수를 간소화합니다.

    널리 사용되는 쿼리나 복잡한 쿼리의 뷰를 만들어 애플리케이션에서 쿼리 텍스트를 분리하고 중앙화할 수 있습니다. 이렇게 하면 여러 애플리케이션에서 쿼리 텍스트를 최신 상태로 더욱 간편하게 유지할 수 있으며 애플리케이션 코드를 변경하지 않아도 쿼리를 수정하고 조정할 수 있습니다.

  • 뷰는 스키마 변경 전반에 걸쳐 안정성을 제공합니다.

    뷰를 정의하는 쿼리는 애플리케이션 논리가 아닌 데이터베이스 스키마에 저장되므로 Spanner는 쿼리가 참조하는 객체(테이블, 열 등)에 대한 스키마 변경사항이 쿼리를 무효화하지 않도록 할 수 있고 이를 보장합니다.

일반 사용 사례

Spanner 데이터베이스에 모든 데이터베이스 사용자에게 노출해서는 안 되는 상위 권한의 데이터가 포함되거나 데이터를 캡슐화하려는 경우 뷰를 사용합니다.

뷰에 추가 보안 기능이 필요하지 않고 뷰의 모든 호출자가 뷰에서 참조하는 모든 스키마 객체에 액세스할 수 있는 경우 호출자의 권한 뷰를 만듭니다.

모든 호출자가 뷰에서 참조하는 모든 스키마 객체에 액세스할 수 없는 뷰를 만들려면 정의자의 권한 뷰를 만듭니다. 데이터베이스 관리자가 뷰에서 참조되는 테이블 및 열에 대한 권한을 더 적은 사용자에게 제공할 수 있으므로 정의자의 권한 뷰는 더 안전하게 보호되며 제한이 더 많습니다. 정의자의 권한 뷰는 사용자가 Spanner 데이터베이스의 관련 하위 집합에 안전하게 액세스할 방법이 필요한 경우에 유용합니다. 예를 들어 다음 데이터에 대한 정의자의 권한 뷰를 만들 수 있습니다.

  • 개인 계정 데이터(예: 애플리케이션 고객).
  • 역할별 데이터(예: HR 담당자, 영업 담당자).
  • 위치 관련 데이터입니다.

호출자의 권한 뷰

뷰에 호출자 권한이 있으면 사용자, 호출자가 뷰에 대한 쿼리를 실행할 때 Spanner가 뷰 및 해당 뷰에서 참조하는 모든 스키마 객체에 대해 사용자 권한을 확인합니다. 사용자가 뷰를 쿼리하려면 모든 스키마 객체에 대한 권한이 있어야 합니다.

정의자의 권한 뷰

정의자의 권한 뷰를 사용하면 보기에 추가 보안 기능이 추가됩니다. 뷰 및 기본 스키마 객체에 다른 권한을 제공합니다. 호출자의 권한 뷰와 마찬가지로 사용자에게 정의자의 권한 뷰를 만들려면 데이터베이스 수준 권한이 있어야 합니다. 가장 큰 차이점은 데이터베이스 역할이 정의자의 권한 뷰를 쿼리할 때 Spanner가 역할이 뷰 자체(뷰에만) 액세스 권한이 있는지 확인한다는 것입니다. 따라서 뷰를 쿼리하는 사용자가 모든 기본 스키마 객체에 액세스할 수 없더라도 뷰에 액세스하여 해당 콘텐츠를 볼 수 있습니다. 정의자의 권한 뷰를 통해 사용자가 뷰에 정의된 행으로 제한된 새 데이터에 액세스할 수 있습니다.

Spanner Identity and Access Management(IAM) 권한은 데이터베이스 수준에서 부여됩니다. 정의자의 권한 뷰와 함께 세분화된 액세스 제어를 사용합니다. 그렇지 않으면 정의자의 권한 뷰에서 추가 액세스 제어를 추가하지 않습니다. 사용자에게 데이터베이스에 대한 읽기 권한이 있으면 데이터베이스의 모든 스키마 객체에 대한 읽기 권한이 있기 때문입니다. 데이터베이스에 세분화된 액세스 제어를 구성한 후 뷰에 대한 SELECT 권한이 있는 세분화된 액세스 제어 사용자와 데이터베이스에 대한 데이터베이스 수준 권한이 있는 사용자가 뷰를 쿼리할 수 있습니다. 차이점은 세분화된 액세스 제어 사용자에게는 기본 객체에 대한 권한이 필요하지 않다는 것입니다.

뷰 제한사항

뷰는 특정 사용 사례에 적합하지 않은 실제 테이블과 비교할 때 제한사항이 있습니다.

  • 뷰는 읽기 전용입니다. 데이터를 추가, 업데이트 또는 삭제하는 데 사용할 수 없습니다.

    DML 문(INSERT, UPDATE, DELETE)에서 뷰를 사용할 수 없습니다.

  • 뷰를 정의하는 쿼리는 쿼리 매개변수를 사용할 수 없습니다.

  • 뷰의 색인을 생성할 수 없습니다.

  • 뷰에 대한 참조는 테이블 힌트를 사용할 수 없습니다.

    하지만 뷰를 정의하는 쿼리에는 해당 뷰가 참조하는 테이블에 테이블 힌트가 포함될 수 있습니다.

  • Read API로는 뷰가 지원되지 않습니다.

  • 정의자 권한 뷰는 Spanner Data Boost에서 지원되지 않습니다.

    Data Boost에서 정의자의 권한 뷰가 포함된 쿼리를 실행하면 오류가 발생합니다.

  • 정의자의 권한 뷰에 액세스하기 위해 권장되는 쿼리 모드NORMAL 모드입니다.

    정의자의 권한 뷰의 기본 스키마 객체에 대한 액세스 권한이 없는 사용자가 정상 이외의 쿼리 모드에서 쿼리를 수행하면 오류가 발생합니다.

  • 사용자가 교묘하게 설계된 쿼리를 만들어 Spanner가 정의자 권한 뷰에서 사용할 수 없는 데이터의 존재를 표시하거나 나타내는 오류를 발생시키게 할 수 있습니다.

    예를 들어 과정을 수강할 수 있는 학생 점수를 반환하는 다음 StudentStudentScores 뷰가 있다고 가정합니다. 자격 기준은 학생의 수준 및 시험 점수를 기반으로 책정됩니다. 학생 수준이 6점 이하인 경우 점수가 중요하며, 자격 요건을 충족하려면 시험에서 50점 이상을 얻어야 합니다. 그렇지 않을 경우 수준이 6 이상이면 기본적으로 학생이 자격을 갖춘 것입니다.

      CREATE VIEW QualifiedStudentScores
      SQL SECURITY DEFINER AS
      SELECT
        s.Name,
        s.Level,
        sc.Score
      FROM Students AS s
      JOIN Scores AS sc ON sc.StudentId = s.StudentId
      WHERE
      (CASE
        WHEN (s.Level < 6) OR (s.Level >= 6 AND sc.Score >= 50)
          THEN 'QUALIFIED';
        ELSE 'FAILED';
      END) = 'QUALIFIED';
    

    사용자는 SELECT * FROM QualifiedStudentScores s WHERE s.Level = 7 AND 1/(s.Score - 20) = 1; 형식으로 쿼리를 실행할 수 있습니다. 뷰가 해당 수준에 대해 데이터를 50점 이상으로 제한하더라도 수준 7에서 20점을 받은 학생이 있으면 이 쿼리는 0으로 나누기 오류로 실패할 수 있습니다.

뷰 사용 시 쿼리 성능

뷰를 참조하는 쿼리는 뷰의 정의로 대체된 뷰 참조를 사용하는 동일 쿼리와 비슷한 성능을 보입니다.

뷰에 적용되는 할당량과 한도

  • 할당량 및 한도 페이지에는 특히 뷰에 대한 할당량 및 한도 정보가 나와 있습니다.

  • 쿼리에서 뷰를 사용하면 뷰의 정의가 쿼리의 일부가 되기 때문에 쿼리 한도에 대한 쿼리 적합성에 영향을 줄 수 있습니다.

비용 영향

뷰 사용은 인스턴스 비용에 미미한 영향을 미칩니다.

  • 뷰 사용은 정의된 쿼리 텍스트를 이를 참조하는 쿼리에 삽입하는 것과 달리 인스턴스의 컴퓨팅 용량 요구사항에 영향을 주지 않습니다.

  • 뷰의 쿼리 정의를 실행하여 생성된 테이블은 영구 데이터베이스 스토리지에 저장되지 않으므로 뷰 사용은 인스턴스의 데이터베이스 스토리지에 미치는 영향이 매우 적습니다.

다음 단계