ビューの作成と管理

このページでは、GoogleSQL 言語データベースと PostgreSQL 言語データベースの 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 権限を持っている限り、ユーザーは基盤となるオブジェクトに対する権限がなくても、ビューに対してクエリを実行できます。

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