このページでは、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 SECURITY
を INVOKER
または 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
ビューを使用するときに作成される仮想テーブルには、SingerId
と Name
の 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';