ビューの概要

このトピックでは、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; の形式でクエリを実行できます。ビューがそのレベルのデータを 50 点以上に制限しているにもかかわらず、レベル 7 に 20 点のスコアを取得した学生がいる場合、このクエリはゼロ除算エラーで失敗する可能性があります。

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

ビューを参照するクエリは、そのビュー参照がビューの定義に置き換えられた同じクエリに匹敵します。

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

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

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

費用への影響

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

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

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

次のステップ