ビューの作成と管理

このページでは、Spanner ビューの作成と管理の方法について説明します。Spanner ビューの詳細については、ビューについてをご覧ください。

権限

ビューの作成、付与、取り消しを行うには、spanner.database.updateDdl 権限が必要です。

ビューを作成する

ビューを作成するには、DDL ステートメント CREATE VIEW を使用してビューに名前を付け、それを定義するクエリを指定します。このステートメントには 2 つの形式があります。

  • CREATE VIEW は、現在のデータベースに新しいビューを定義します。view_name という名前のビューがすでに存在する場合、CREATE VIEW ステートメントは失敗します。

  • CREATE OR REPLACE VIEW は、現在のデータベースに新しいビューを定義します。view_name という名前のビューがすでに存在する場合、その定義は置き換えられます。

CREATE VIEW ステートメントの構文は次のとおりです。

{CREATE | CREATE OR REPLACE } VIEW  view_name
SQL SECURITY { INVOKER | DEFINER }
AS query

ビューは仮想テーブルであるため、指定する query はその仮想テーブルのすべての列の名前を指定する必要があります。

また、Spanner は厳密な名前解決を使用して指定された query をチェックします。つまり、クエリで使用されるすべてのスキーマ オブジェクト名は、単一のスキーマ オブジェクトを明確に識別できるように修飾する必要があります。たとえば次の例では、Singers テーブルの SingerId 列は Singers.SingerId として修飾する必要があります。

CREATE VIEW または CREATE OR REPLACE VIEW ステートメントで、SQL SECURITYINVOKER または DEFINER として指定する必要があります。2 つのセキュリティ タイプの違いについて詳しくは、ビューについてをご覧ください。

たとえば、Singers テーブルが次のように定義されているとします。

GoogleSQL

CREATE TABLE Singers (
  SingerId   INT64 NOT NULL,
  FirstName  STRING(1024),
  LastName   STRING(1024),
  SingerInfo BYTES(MAX)
) PRIMARY KEY (SingerId);

PostgreSQL

CREATE TABLE Singers (
  SingerId   BIGINT PRIMARY KEY,
  FirstName  VARCHAR(1024),
  LastName   VARCHAR(1024),
  SingerInfo BYTEA
);

次のように、呼び出し元の権限を持つ SingerNames ビューを定義できます。

CREATE VIEW SingerNames
SQL SECURITY INVOKER
AS SELECT
   Singers.SingerId AS SingerId,
   Singers.FirstName || ' ' || Singers.LastName AS Name
FROM Singers;

クエリで SingerNames ビューを使用するときに作成される仮想テーブルには、SingerIdName の 2 つの列があります。

この SingerNames ビューの定義は有効ですが、次のセクションで説明するように、すべてのスキーマ変更時の安定性を確保するため、データ型のキャスティングを行うときのベスト プラクティスには従いません。

ビューを作成する際のベスト プラクティス

ビューの定義を更新する必要がないようにするには、ビューを定義するクエリ内のすべてのテーブル列のデータ型を明示的にキャスティングします。こうすると、列の型に対するすべてのスキーマ変更に対して、ビューの定義が有効なまま保持されます。

たとえば、SingerNames ビューの定義は Singers テーブルの列のデータ型を変更した結果、無効になる場合があります。

CREATE VIEW SingerNames
SQL SECURITY INVOKER
AS SELECT
   Singers.SingerId AS SingerId,
   Singers.FirstName || ' ' || Singers.LastName AS Name
FROM Singers;

次のように、目的のデータ型に列を明示的にキャスティングすることで、ビューが無効にならないようにできます。

GoogleSQL

CREATE OR REPLACE VIEW SingerNames
SQL SECURITY INVOKER
AS SELECT
 CAST(Singers.SingerId AS INT64) AS SingerId,
 CAST(Singers.FirstName AS STRING) || " " || CAST(Singers.LastName AS STRING) AS Name
FROM Singers;

PostgreSQL

CREATE OR REPLACE VIEW SingerNames
SQL SECURITY INVOKER
AS SELECT
 CAST(Singers.SingerId AS bigint) AS SingerId,
 CAST(Singers.FirstName AS varchar) || ' ' || CAST(Singers.LastName AS varchar) AS Name
FROM Singers;

ビューへのアクセス権の付与と取り消し

きめ細かなアクセス制御ユーザーは、ビューに対する SELECT 権限を付与されている必要があります。ビューに対する SELECT 権限をデータベース ロールに付与するには:

GoogleSQL

GRANT SELECT ON VIEW SingerNames TO ROLE Analyst;

PostgreSQL

GRANT SELECT ON TABLE SingerNames TO Analyst;

データベース ロールのビューに対する SELECT 権限を取り消すには:

GoogleSQL

REVOKE SELECT ON VIEW SingerNames FROM ROLE Analyst;

PostgreSQL

REVOKE SELECT ON TABLE SingerNames FROM Analyst;

ビューのクエリ

呼び出し元の権限または定義者の権限ビューをクエリする方法は同じです。ただし、ビューのセキュリティ タイプによっては、Spanner は、クエリを呼び出したプリンシパルのデータベース ロールに対してビュー内で参照されているスキーマ オブジェクトをチェックする必要がある場合があります。

呼び出し元の権限ビューをクエリする

ビューに呼び出し元の権限がある場合、ビューのクエリを実行するには、そのビューの基になるすべてのスキーマ オブジェクトに対する権限が必要です。

たとえば、データベース ロールが SingerNames ビューによって参照されるすべてのオブジェクトにアクセスできる場合、SingerNames ビューに対してクエリを実行できます。

SELECT COUNT(SingerID) as SingerCount
FROM SingerNames;

定義者の権限ビューをクエリする

ビューに定義者の権限がある場合、必要なロールがビューに対する SELECT 権限を持っている限り、ユーザーは基になるオブジェクトに対する権限がなくてもビューに対してクエリを実行できます。

次の例では、Analyst データベース ロールを持つユーザーが SingerNames ビューに対するクエリを実行しようとしています。ただし、SingerNames は呼び出し元の権限ビューであり、Analyst のロールは基となるすべてのオブジェクトへのアクセス権を持たないため、ユーザーはアクセスを拒否されます。このケースでは、Analyst にビューへのアクセス権を付与するが、Singers テーブルへのアクセス権は付与したくない場合、ビューのセキュリティ タイプを定義者の権限に置き換えることが可能です。ビューのセキュリティ タイプを置き換えたら、Analyst のロールにビューへのアクセス権を付与します。これで、ユーザーは Singers テーブルへのアクセス権がない場合でも、SingerNames ビューに対してクエリを実行できるようになります。

SELECT COUNT(SingerID) as SingerCount
FROM SingerNames;

ビューを置き換える

ビューを置き換えるには、CREATE OR REPLACE VIEW ステートメントを使用してビュー定義やビューのセキュリティ タイプを変更します。

ビューの置き換えは、ビューを削除して再作成するのと似ています。最初のビューに付与したアクセス権は、ビューを置き換えた後に再度付与する必要があります。

呼び出し元の権限ビューを定義者の権限ビューに置き換えるには:

CREATE OR REPLACE VIEW SingerNames
SQL SECURITY DEFINER
AS SELECT
   Singers.SingerId AS SingerId,
   Singers.FirstName || ' ' || Singers.LastName AS Name
FROM Singers;

ビューを削除する

ビューが削除されると、その権限を持つデータベース ロールはアクセスできなくなります。データセットを削除するには、DROP VIEW ステートメントを使用します。

DROP VIEW SingerNames;

ビューの情報を取得する

データベース内のビューに関する情報を取得するには、INFORMATION_SCHEMA スキーマでテーブルにクエリを実行します。

  • INFORMATION_SCHEMA.TABLES テーブルには、定義済みのすべてのビューの名前が示されています。

  • INFORMATION_SCHEMA.VIEWS テーブルには、定義済みのすべてのビューの名前、ビュー定義、セキュリティ タイプ、クエリテキストが表示されます。ビューに対する SELECT 権限を持つ FGAC ユーザーは、INFORMATION_SCHEMA.VIEWS テーブルからビューに関する情報を取得できます。他の FGAC ユーザーには、ビューに対する SELECT 権限がない場合は spanner_info_reader ロールが必要です。

ProductSoldLastWeek というビューのビュー定義とセキュリティ タイプを確認するには:

  SELECT *
  FROM INFORMATION_SCHEMA.VIEWS
  WHERE TABLE_NAME = 'ProductSoldLastWeek';