名前付きスキーマを作成および管理する

このページでは、名前付きスキーマの作成、使用、削除方法と、名前付きスキーマ内のオブジェクトに詳細なアクセス制御を適用する方法について説明します。名前付きスキーマの概要については、名前付きスキーマをご覧ください。

始める前に

このページの手順を実施するには、以下のものが必要です。

名前付きスキーマを作成する

名前付きスキーマの作成には、CREATE SCHEMA コマンド(GoogleSQLPostgreSQL)を使用します。

  1. Google Cloud コンソールで、[Spanner] ページを開きます。

    Spanner に移動

  2. リストからインスタンスを選択します。

  3. データベースを選択します。

  4. ナビゲーション メニューで [Spanner Studio] をクリックします。

  5. [新しい SQL エディタタブ] または [新しいタブ] をクリックし、新しいタブを開きます。

  6. [エディタ] タブで 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 ステートメントがデフォルトでこの処理を行います。名前付きスキーマにインデックスを作成するために完全修飾名を使用する必要はありません。

  7. 名前付きスキーマと関連オブジェクトを [エクスプローラ] ペインで表示します。

名前付きスキーマにきめ細かいアクセス制御を追加する

次の DDL ステートメントは、名前付きスキーマにきめ細かいアクセス制御を追加します。

  • USAGE 権限は、スキーマ オブジェクトに権限を付与します。USAGE 権限は、デフォルトでデフォルト スキーマに付与されます。ただし、デフォルト スキーマの USAGE 権限は取り消すことができます。アクセス権を取り消す際は注意してください。取り消されたユーザーとロールは、デフォルト スキーマ内のオブジェクトへのアクセス権をすべて失います。
  • ALL ステートメントは、スキーマ内の型のすべてのオブジェクトに対して権限を一括付与します。
  • DEFAULT キーワードは、FGAC DDL ステートメントのデフォルト スキーマを参照します。

名前付きスキーマ内のオブジェクトにアクセスするには、名前付きスキーマに対する使用権限と、そのスキーマを使用するデータベース オブジェクトに対する対応する権限が必要です。次のステートメントにより、次の権限が付与されます。

  • GRANT ALLGoogleSQLPostgreSQL)は、名前付きスキーマで作成されたテーブル内のすべてのオブジェクトにアクセスするロール権限を付与します。このステートメントは、その時点で存在するオブジェクトにのみ適用されます。後でテーブルにオブジェクトを追加する場合は、作成時にそのオブジェクトへのアクセス権を付与する必要があります。
  • GRANT USAGEGoogleSQLPostgreSQL)は、スキーマに含まれるオブジェクトにアクセスするロール権限を付与します。これにより、権限付与の対象はスキーマ内のオブジェクトを検索できます。
  1. Google Cloud コンソールで、[Spanner] ページを開きます。

    Spanner に移動

  2. リストからインスタンスを選択します。

  3. データベースを選択します。

  4. ナビゲーション メニューで [Spanner Studio] をクリックします。

  5. [新しい SQL エディタタブ] または [新しいタブ] をクリックし、新しいタブを開きます。

  6. [エディタ] タブで DDL を入力します。

    GoogleSQL

    名前付きスキーマのカスタムロールを作成します。次の例では、role1role2 を使用します。

    CREATE ROLE role1
    CREATE ROLE role2
    

    GRANT ALL を使用して、名前付きスキーマを使用するテーブルにロールを付与します。次の例では、名前付きスキーマに sch1 を使用し、ロールに role1 を使用しています。

    GRANT SELECT ON ALL TABLES IN SCHEMA sch1 TO ROLE role1
    

    作成したロールにスキーマの使用権を付与します。次の例では、sch1 の使用権を role1role2 に付与します。

    GRANT USAGE ON SCHEMA sch1 TO ROLE role1, role2
    

    PostgreSQL

    名前付きスキーマのカスタムロールを作成します。次の例では、role1role2 を使用します。

    CREATE ROLE role1
    CREATE ROLE role2
    

    GRANT ALL を使用して、名前付きスキーマを使用するテーブルにロールを付与します。次の例では、名前付きスキーマに sch1 を使用し、ロールに role1 を使用しています。

    GRANT SELECT ON ALL TABLES IN SCHEMA sch1 TO role1
    

    作成したロールにスキーマの使用権を付与します。次の例では、sch1 の使用権を role1role2 に付与します。

    GRANT USAGE ON SCHEMA sch1 TO role1, role2
    

デフォルト スキーマにきめ細かいアクセス制御を追加および取り消しする

スキーマに名前を付けると、デフォルト スキーマは default と呼ばれます。きめ細かいアクセス制御を追加または取り消す場合は、default スキーマ名を使用する必要があります。

デフォルト スキーマにきめ細かいアクセス制御を追加する

デフォルトでは、すべてのユーザーとロールにデフォルト スキーマに対する USAGE 権限が付与されています。

  1. Google Cloud コンソールで、[Spanner] ページを開きます。

    Spanner に移動

  2. リストからインスタンスを選択します。

  3. データベースを選択します。

  4. ナビゲーション メニューで [Spanner Studio] をクリックします。

  5. [新しい SQL エディタタブ] または [新しいタブ] をクリックし、新しいタブを開きます。

  6. [エディタ] タブで 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 コマンドを使用して取り消すことができます。

  1. Google Cloud コンソールで、[Spanner] ページを開きます。

    Spanner に移動

  2. リストからインスタンスを選択します。

  3. データベースを選択します。

  4. ナビゲーション メニューで [Spanner Studio] をクリックします。

  5. [新しい SQL エディタタブ] または [新しいタブ] をクリックし、新しいタブを開きます。

  6. [エディタ] タブで DDL を入力します。

    GoogleSQL

    REVOKE USAGE ON SCHEMA DEFAULT FROM ROLE public
    

    PostgreSQL

    REVOKE USAGE ON SCHEMA public FROM public
    
  7. 前述のコマンドを実行したら、デフォルト スキーマにアクセスする必要があるロールに権限を明示的に付与する必要があります。次の例では、role1 に権限を付与します。

    GoogleSQL

    次の例では、デフォルト スキーマへのアクセス権を role1 に付与します。

    SCHEMA default to ROLE role1
    

    PostgreSQL

    次の例では、デフォルト スキーマへのアクセス権を role1 に付与します。

    GRANT USAGE ON SCHEMA public To role1
    

名前付きスキーマを表示する

  1. リストからインスタンスを選択します。
  2. データベースを選択します。
  3. ナビゲーション メニューで [Spanner Studio] をクリックします。
  4. [エクスプローラ] ペインで、[スキーマ] プルダウン リストを開きます。

    スキーマ リストを開いた状態のエクスプローラ

また、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 コマンド(GoogleSQLPostgreSQL)を使用します。

  1. Google Cloud コンソールで、[Spanner] ページを開きます。

    Spanner に移動

  2. リストからインスタンスを選択します。

  3. データベースを選択します。

  4. ナビゲーション メニューで [Spanner Studio] をクリックします。

  5. [新しい SQL エディタタブ] または [新しいタブ] をクリックし、新しいタブを開きます。

  6. [エディタ] タブで DDL を入力します。

    GoogleSQL

    次の例では、sch1 を削除します。

    DROP SCHEMA IF EXISTS sch1;
    

    PostgreSQL

    次の例では、sch1 を削除します。

    DROP SCHEMA IF EXISTS sch1;
    

次のステップ