ビューの概要

このトピックでは、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 点のスコアを取得した学生がいる場合、このクエリはゼロ除算エラーで失敗する可能性があります。

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

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

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

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

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

費用への影響

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

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

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

次のステップ