ビューの概要

このドキュメントでは、Spanner ビューについて説明します。

概要

ビューは SQL クエリによって定義される仮想テーブルです。ビューを作成するときに、それが表す SQL クエリを指定します。ビューを作成すると、ビューをテーブルのように参照するクエリを実行できます。

ビューを参照するクエリを実行すると、Spanner はビューに定義されているクエリを実行して仮想テーブルを作成します。この仮想テーブルのコンテンツは、参照クエリによって使用されます。

ビューを参照するクエリを実行するたびに、ビューを定義するクエリが実行されます。このため、ビューは論理ビューまたは動的ビューと呼ばれることがあります。これは、ビューを定義する実際の結果と、データ ストレージに実際のテーブルとして格納する SQL マテリアライズド ビューと区別するためです。

Spanner では、呼び出し元の権限ビューまたは定義者の権限ビューとしてビューを作成できます。この 2 つは、ユーザー向けのビューへのアクセスを制御するセキュリティ モデルです。

呼び出し元の権限ビュー定義者の権限ビュー
説明 呼び出し元の権限でビューを作成する場合、ビューをクエリするために、データベース ロールにはビューに対する権限と、ビューが参照するすべてのスキーマ オブジェクトに対する権限が必要です。詳細については、呼び出し元の権限ビューをご覧ください。 定義者の権限でビューを作成する場合、ビューをクエリするために、データベース ロールにはそのビュー(そのビューのみ)に対する権限が必要です。定義者の権限ビューと一緒に、きめ細かいアクセス制御を使用してください。使用しないと、定義者の権限ビューにはその他のアクセス制御が追加されません。詳細については、定義者の権限ビューをご覧ください。
ビューの作成に必要な権限 どちらのビュータイプでも、ビュータイプに対するアクセス権の作成、付与、取り消しを行うには、データベース レベルの spanner.database.updateDdl 権限が必要です。
ビューをクエリするために必要な権限 ビューをクエリするために、データベース ロールにはビューとその基になるすべてのスキーマ オブジェクトに対する権限が必要です。 ビューをクエリするには、データベース ロールにそのビュー(そのビューのみ)に対する権限が必要です。

ビューのメリット

アプリケーション ロジックで定義するクエリを含める場合と比べると、ビューにはいくつかのメリットがあります。

  • ビューは、アプリケーションに論理的なデータ モデリングを提供できます。

    Spanner で物理データ モデリングに適した選択が、そのデータを読み取るアプリケーションでは最適な抽象化ではないこともあります。ビューを使用することで、こうしたアプリケーションにより適した抽象化である代替のテーブル スキーマを提供できます。

  • ビューではクエリ定義が一元化されるため、メンテナンスが容易になります。

    広く使用されているクエリや複雑なクエリにビューを作成することで、アプリケーションからクエリテキストを分離し、一元化できます。これにより、アプリケーション全体でクエリテキストを最新の状態に保つことが非常に容易になります。アプリケーション コードを変更することなく、クエリの修正や調整ができるようになります。

  • ビューは、スキーマの変更に対する安定性を提供します。

    ビューを定義するクエリは、アプリケーション ロジックではなくデータベース スキーマに保存されます。このため、Spanner では、クエリが参照するオブジェクト(テーブル、列など)のスキーマが変更されても、クエリが無効にならないようにすることができます。

一般的なユースケース

すべてのデータベース ユーザーに公開すべきではない特権データが Spanner データベースに含まれている場合や、データをカプセル化する場合に、ビューを使用します。

ビューにセキュリティ機能を追加する必要がなく、ビューのすべての呼び出し元が、ビューが参照するすべてのスキーマ オブジェクトにアクセスできる場合は、呼び出し元の権限ビューを作成します。

ビューが参照するスキーマ オブジェクトに一部の呼び出し元がアクセスできないビューを作成する場合は、定義者の権限ビューを作成します。定義者の権限ビューにはより多くの制限が設けられ、保護が強化されています。データベース管理者は、ビュー内で参照されるテーブルや列に対する権限を付与するユーザー数を少なくすることができます。定義者の権限ビューは、Spanner データベースの関連するサブセットに安全にアクセスする方法が必要な場合に便利です。たとえば、次のデータに対して定義者の権限ビューを作成するとします。

  • 個人アカウントのデータ(アプリケーションのユーザーなど)。
  • 役職固有のデータ(人事担当者、販売担当者など)。
  • 地域固有のデータ。

呼び出し元の権限ビュー

ビューに呼び出し元の権限がある場合、呼び出し元であるユーザーがビューをクエリすると、Spanner はビューとビューが参照するすべてのスキーマ オブジェクトに対するユーザーの権限をチェックします。ユーザーがビューをクエリするには、すべてのスキーマ オブジェクトに対する権限が必要です。

定義者の権限ビュー

定義者の権限ビューでは、ビューにセキュリティ機能が追加されています。これにより、ビューと基盤となるスキーマ オブジェクトに対してさまざまな権限が提供されます。呼び出し元の権限ビューと同様に、定義者の権限ビューを作成するには、データベース レベルの権限が必要です。主な違いは、データベース ロールが定義者の権限ビューをクエリすると、Spanner はロールがビュー自体(そのビューのみ)にアクセスできることを確認する点です。このため、ビューをクエリするユーザーに、基盤となるすべてのスキーマ オブジェクトに対するアクセス権がない場合でも、ビューにアクセスしてその内容を確認できます。定義者の権限ビューを使用すると、ビューで定義された行でのみ最新のデータにアクセスできる権限をユーザーに付与できます。

Spanner の Identity and Access Management(IAM)権限はデータベース レベルで付与されます。定義者の権限ビューと一緒に、きめ細かいアクセス制御を使用してください。使用しないと、定義者の権限ビューにはその他のアクセス制御が追加されません。これは、ユーザーにデータベースに対する読み取り権限が付与されている場合、データベース内のすべてのスキーマ オブジェクトに対する読み取り権限が含まれるためです。データベースできめ細かいアクセス制御を構成すると、ビューに対する SELECT 権限を持ち、きめ細かいアクセス制御が適用されているユーザーと、データベースに対するデータベース レベルの権限を持つユーザーがビューをクエリできるようになります。違いは、きめ細かいアクセス制御のユーザーには、基になるオブジェクトに対する権限が必要ないことです。

ビューの制限事項

ビューには、実際のテーブルと比べると制限が多いため、特定のユースケースには適していません。

  • ビューは読み取り専用です。データの追加、更新、削除には使用できません。

    DML ステートメント(INSERTUPDATEDELETE)ではビューを使用できません。

  • ビューを定義するクエリで、クエリ パラメータを使用できません。

  • ビューをインデックスに登録することはできません。

  • ビューの参照でテーブルヒントを使用できません。

    ただし、ビューを定義するクエリには、そのクエリが参照するテーブルのテーブルヒントを含めることができます。

  • ビューは、Read API ではサポートされていません。

  • 定義者の権限ビューは Spanner Data Boost ではサポートされていません。

    Data Boost で定義者の権限ビューを含むクエリを実行すると、エラーが発生します。

  • 定義者の権限ビューにアクセスするための推奨のクエリモードNORMAL モードです。

    定義者の権限ビューの基になるスキーマ オブジェクトに対するアクセス権のないユーザーが通常のクエリ以外のモードでクエリを実行すると、エラーが発生します。

  • クエリを慎重に作成して、Spanner でエラーを発生させ、定義者の権限ビューで利用できないデータの存在を明らかにすることができます。

    たとえば、コースの受講資格を持つ学生のスコアを返す QualifiedStudentScores ビューについて考えてみましょう。資格の基準は、学生のレベルと試験のスコアに基づいています。学生のレベルが 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; の形式でクエリを実行できます。ビューで、レベル 7 のデータを 50 点以上に制限しているにもかかわらず、そのレベルで 20 点のスコアを取得した学生がいる場合、このクエリはゼロ除算エラーで失敗する可能性があります。

ビューを使用する場合のクエリのパフォーマンス

ビューを参照するクエリは、ビューの参照をビューの定義に置き換えたクエリと同等のパフォーマンスを発揮します。

ビューに適用される割り当てと上限

  • ビューの割り当てと上限の情報は、割り当てと上限のページに掲載されています。

  • クエリでビューを使用すると、ビューの定義がクエリの一部になるため、そのクエリのクエリ上限に達する場合があります。

費用への影響

ビューを使用しても、インスタンスの費用にほとんど影響はありません。

  • 定義したクエリテキストを参照するクエリに埋め込んだ場合と比べると、ビューを使用してもインスタンスのコンピューティング容量に影響はありません。

  • ビューのクエリ定義を実行して生成されたテーブルは永続データベース ストレージには格納されません。ビューを使用しても、インスタンスのデータベース ストレージにほとんど影響はありません。

次のステップ