このページでは、名前付きスキーマの作成、使用、削除方法と、名前付きスキーマ内のオブジェクトに詳細なアクセス制御を適用する方法について説明します。名前付きスキーマの概要については、名前付きスキーマをご覧ください。
始める前に
このページの手順を実施するには、以下のものが必要です。
- ユーザー アカウントの データベース管理者ロール / spanner.databaseAdmin ロール。
- きめ細かいアクセス制御の仕組みを理解する。
名前付きスキーマを作成する
名前付きスキーマの作成には、CREATE SCHEMA
コマンド(GoogleSQL と PostgreSQL)を使用します。
Google Cloud コンソールで、[Spanner] ページを開きます。
リストからインスタンスを選択します。
データベースを選択します。
ナビゲーション メニューで [Spanner Studio] をクリックします。
[新しい SQL エディタタブ] または [新しいタブ] をクリックし、新しいタブを開きます。
[エディタ] タブで DDL を入力します。
GoogleSQL
CREATE SCHEMA
ステートメントを実行して、名前付きスキーマを作成します。次に例を示します。CREATE SCHEMA sch1;
名前付きスキーマにデータベース オブジェクトを追加します。次に例を示します。
CREATE SEQUENCE sch1.sequence OPTIONS ( sequence_kind = 'bit_reversed_positive' ); CREATE TABLE Singers ( SingerId INT64 NOT NULL, FirstName STRING(1024), LastName STRING(1024), SingerInfo BYTES(MAX), ) PRIMARY KEY(SingerId); CREATE INDEX indexOnSingers ON Singers(FirstName); CREATE TABLE Albums ( SingerId INT64 NOT NULL, AlbumId INT64 NOT NULL, AlbumTitle STRING(MAX), ) PRIMARY KEY(SingerId, AlbumId), INTERLEAVE IN PARENT Singers ON DELETE CASCADE; CREATE TABLE Songs ( SingerId INT64 NOT NULL, AlbumId INT64 NOT NULL, TrackId INT64 NOT NULL, SongName STRING(MAX), ) PRIMARY KEY(SingerId, AlbumId, TrackId), INTERLEAVE IN PARENT Albums ON DELETE CASCADE; CREATE TABLE sch1.Singers ( SingerId INT64 NOT NULL, FirstName STRING(1024), LastName STRING(1024), SingerInfo BYTES(MAX), ) PRIMARY KEY(SingerId); CREATE INDEX sch1.indexOnSingers ON sch1.Singers(FirstName); CREATE TABLE sch1.Albums ( SingerId INT64 NOT NULL, AlbumId INT64 NOT NULL, AlbumTitle STRING(MAX), ) PRIMARY KEY(SingerId, AlbumId), INTERLEAVE IN PARENT sch1.Singers ON DELETE CASCADE; CREATE TABLE sch1.Songs ( SingerId INT64 NOT NULL, AlbumId INT64 NOT NULL, TrackId INT64 NOT NULL, SongName STRING(MAX), ) PRIMARY KEY(SingerId, AlbumId, TrackId), INTERLEAVE IN PARENT sch1.Albums ON DELETE CASCADE; CREATE VIEW sch1.SingerView SQL SECURITY INVOKER AS Select s.FirstName, s.LastName, s.SingerInfo FROM sch1.Singers AS s WHERE s.SingerId = 123456; CREATE VIEW SingerView SQL SECURITY INVOKER AS Select s.FirstName, s.LastName, s.SingerInfo FROM Singers AS s WHERE s.SingerId = 123456;
Spanner では、インデックスを使用するテーブルと同じスキーマを使用するインデックスのみを作成できます。インデックスとテーブルのスキーマ名が同じであることを確認する必要があります。
PostgreSQL
CREATE SCHEMA
ステートメントを実行して、名前付きスキーマを作成します。次に例を示します。CREATE SCHEMA sch1;
名前付きスキーマにデータベース オブジェクトを追加します。次に例を示します。
CREATE SEQUENCE sch1.sequence BIT_REVERSED_POSITIVE CREATE TABLE sch1.singers( singer_id bigint primary key, album_id bigint default(nextval('sch1.sequence'))) CREATE TABLE sch1.albums(k bigint default(nextval('sch1.sequence'))primary key, album_id bigint) CREATE VIEW sch1.singer_view SQL SECURITY INVOKER AS SELECT * FROM sch1.singers CREATE INDEX index_singers ON TABLE sch1.singers(album_id)
Spanner では、同じスキーマ内でのみインデックスを作成できます。Spanner では、PostgreSQL ステートメントがデフォルトでこの処理を行います。名前付きスキーマにインデックスを作成するために完全修飾名を使用する必要はありません。
名前付きスキーマと関連オブジェクトを [エクスプローラ] ペインで表示します。
名前付きスキーマにきめ細かいアクセス制御を追加する
次の DDL ステートメントは、名前付きスキーマにきめ細かいアクセス制御を追加します。
USAGE
権限は、スキーマ オブジェクトに権限を付与します。USAGE
権限は、デフォルトでデフォルト スキーマに付与されます。ただし、デフォルト スキーマのUSAGE
権限は取り消すことができます。アクセス権を取り消す際は注意してください。取り消されたユーザーとロールは、デフォルト スキーマ内のオブジェクトへのアクセス権をすべて失います。ALL
ステートメントは、スキーマ内の型のすべてのオブジェクトに対して権限を一括付与します。DEFAULT
キーワードは、FGAC DDL ステートメントのデフォルト スキーマを参照します。
名前付きスキーマ内のオブジェクトにアクセスするには、名前付きスキーマに対する使用権限と、そのスキーマを使用するデータベース オブジェクトに対する対応する権限が必要です。次のステートメントにより、次の権限が付与されます。
GRANT ALL
(GoogleSQL と PostgreSQL)は、名前付きスキーマで作成されたテーブル内のすべてのオブジェクトにアクセスするロール権限を付与します。このステートメントは、その時点で存在するオブジェクトにのみ適用されます。後でテーブルにオブジェクトを追加する場合は、作成時にそのオブジェクトへのアクセス権を付与する必要があります。GRANT USAGE
(GoogleSQL と PostgreSQL)は、スキーマに含まれるオブジェクトにアクセスするロール権限を付与します。これにより、権限付与の対象はスキーマ内のオブジェクトを検索できます。
Google Cloud コンソールで、[Spanner] ページを開きます。
リストからインスタンスを選択します。
データベースを選択します。
ナビゲーション メニューで [Spanner Studio] をクリックします。
[新しい SQL エディタタブ] または [新しいタブ] をクリックし、新しいタブを開きます。
[エディタ] タブで DDL を入力します。
GoogleSQL
名前付きスキーマのカスタムロールを作成します。次の例では、
role1
とrole2
を使用します。CREATE ROLE role1 CREATE ROLE role2
GRANT ALL
を使用して、名前付きスキーマを使用するテーブルにロールを付与します。次の例では、名前付きスキーマにsch1
を使用し、ロールにrole1
を使用しています。GRANT SELECT ON ALL TABLES IN SCHEMA sch1 TO ROLE role1
作成したロールにスキーマの使用権を付与します。次の例では、
sch1
の使用権をrole1
とrole2
に付与します。GRANT USAGE ON SCHEMA sch1 TO ROLE role1, role2
PostgreSQL
名前付きスキーマのカスタムロールを作成します。次の例では、
role1
とrole2
を使用します。CREATE ROLE role1 CREATE ROLE role2
GRANT ALL
を使用して、名前付きスキーマを使用するテーブルにロールを付与します。次の例では、名前付きスキーマにsch1
を使用し、ロールにrole1
を使用しています。GRANT SELECT ON ALL TABLES IN SCHEMA sch1 TO role1
作成したロールにスキーマの使用権を付与します。次の例では、
sch1
の使用権をrole1
とrole2
に付与します。GRANT USAGE ON SCHEMA sch1 TO role1, role2
デフォルト スキーマにきめ細かいアクセス制御を追加および取り消しする
スキーマに名前を付けると、デフォルト スキーマは default
と呼ばれます。きめ細かいアクセス制御を追加または取り消す場合は、default
スキーマ名を使用する必要があります。
デフォルト スキーマにきめ細かいアクセス制御を追加する
デフォルトでは、すべてのユーザーとロールにデフォルト スキーマに対する USAGE
権限が付与されています。
Google Cloud コンソールで、[Spanner] ページを開きます。
リストからインスタンスを選択します。
データベースを選択します。
ナビゲーション メニューで [Spanner Studio] をクリックします。
[新しい SQL エディタタブ] または [新しいタブ] をクリックし、新しいタブを開きます。
[エディタ] タブで DDL を入力します。
GoogleSQL
次の例では、すべてのテーブルへのアクセス権を
role1
に付与します。GRANT SELECT ON ALL TABLES IN SCHEMA default TO ROLE role1
PostgreSQL
次の例では、すべてのテーブルへのアクセス権を
role1
に付与します。GRANT SELECT ON ALL TABLES IN SCHEMA default TO role1
デフォルト スキーマに対するきめ細かいアクセス制御を取り消す
デフォルト スキーマのデフォルトのきめ細かいアクセス制御権限は、REVOKE USAGE
コマンドを使用して取り消すことができます。
Google Cloud コンソールで、[Spanner] ページを開きます。
リストからインスタンスを選択します。
データベースを選択します。
ナビゲーション メニューで [Spanner Studio] をクリックします。
[新しい SQL エディタタブ] または [新しいタブ] をクリックし、新しいタブを開きます。
[エディタ] タブで DDL を入力します。
GoogleSQL
REVOKE USAGE ON SCHEMA DEFAULT FROM ROLE public
PostgreSQL
REVOKE USAGE ON SCHEMA public FROM public
前述のコマンドを実行したら、デフォルト スキーマにアクセスする必要があるロールに権限を明示的に付与する必要があります。次の例では、
role1
に権限を付与します。GoogleSQL
次の例では、デフォルト スキーマへのアクセス権を
role1
に付与します。SCHEMA default to ROLE role1
PostgreSQL
次の例では、デフォルト スキーマへのアクセス権を
role1
に付与します。GRANT USAGE ON SCHEMA public To role1
名前付きスキーマを表示する
- リストからインスタンスを選択します。
- データベースを選択します。
- ナビゲーション メニューで [Spanner Studio] をクリックします。
[エクスプローラ] ペインで、[スキーマ] プルダウン リストを開きます。
また、SQL を使用して information_schema.schemata
テーブル内のすべてのスキーマを表示することもできます。
次の例は、ビュー名のスキーマとそのオーナーを表示する方法を示しています。
SELECT schema_name, schema_owner
FROM information_schema.schemata
ORDER BY schema_owner
このステートメントは、次のようなスキーマとオーナーのリストを返します。
public spanner_admin
products spanner_admin
analytics spanner_admin
logs spanner_admin
pg_catalog spanner_system
information_schema spanner_system
spanner_sys spanner_system
名前付きスキーマを削除する
名前付きスキーマを削除するには、DROP SCHEMA
コマンド(GoogleSQL と PostgreSQL)を使用します。
Google Cloud コンソールで、[Spanner] ページを開きます。
リストからインスタンスを選択します。
データベースを選択します。
ナビゲーション メニューで [Spanner Studio] をクリックします。
[新しい SQL エディタタブ] または [新しいタブ] をクリックし、新しいタブを開きます。
[エディタ] タブで DDL を入力します。
GoogleSQL
次の例では、
sch1
を削除します。DROP SCHEMA IF EXISTS sch1;
PostgreSQL
次の例では、
sch1
を削除します。DROP SCHEMA IF EXISTS sch1;
次のステップ
- スキーマのベスト プラクティスを確認する。
- ビューについて学習する。
- セカンダリ インデックスについて学習する。
- 外部キーについて学習する。