このページでは、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';