詳細なアクセス制御を行うための権限

このページでは、きめ細かいアクセス制御のためにデータベースのロールに付与できる権限について説明します。この情報は、GoogleSQL 言語データベースと PostgreSQL 言語データベースの両方に適用されます。

データベースのロールときめ細かいアクセス制御については、きめ細かいアクセス制御の概要をご覧ください。

次の表に、きめ細かいアクセス制御の権限と、それらの権限を付与できるデータベース オブジェクトを示します。

SELECT INSERT UPDATE DELETE EXECUTE USAGE
スキーマ
テーブル
ビュー
変更ストリーム
変更ストリームの読み取り関数
シーケンス
モデル

以降のセクションでは、各権限について詳しく説明します。

SELECT

テーブル、ビュー、変更ストリーム、シーケンス、モデルに対する読み取りまたはクエリを行うロールを許可します。

  • テーブルに列リストが指定されている場合、権限はそれらの列に対してのみ有効です。列リストが指定されていない場合、権限は、テーブル内のすべての列に対して有効です(後で追加された列も含む)。ビューでは列リストを使用できません。

  • Spanner は、呼び出し元の権限ビューと定義者の権限ビューの両方をサポートしています。詳細については、ビューの概要をご覧ください。

    呼び出し元の権限でビューを作成する場合、ビューにクエリを実行するには、データベース ロール、またはユーザーにビューの SELECT 権限とビューで参照される基になるオブジェクトへの SELECT 権限も必要です。たとえば、Singers テーブルにビュー SingerNames が作成されているとします。

    CREATE VIEW SingerNames SQL SECURITY INVOKER AS
    SELECT Singers.SingerId, Singers.FirstName, Singers.LastName FROM Singers;
    

    データベース ロール myRole がクエリ SELECT * FROM SingerNames を実行するとします。このロールには、ビューに対する SELECT 権限と、参照される 3 つの列または Singers テーブル全体に対する SELECT 権限が必要です。

    定義者の権限でビューを作成する場合、ビューにクエリを実行するには、データベース ロール、またはユーザーにビューの SELECT 権限のみが必要です。たとえば、Albums テーブルにビュー AlbumsBudget が作成されているとします。

    CREATE VIEW AlbumsBudget SQL SECURITY DEFINER AS
    SELECT Albums.Id, Albums.AlbumTitle, MarketingBudget FROM Albums;
    

    データベース ロール Analyst がクエリ SELECT * FROM AlbumsBudget を実行するとします。このロールには、ビューに対する SELECT 権限のみが必要です。参照される 3 つの列または Albums テーブルに対する SELECT 権限は必要ありません。

  • テーブルの列のサブセットに SELECT を付与すると、FGAC ユーザーはそのテーブルで SELECT * を使用できなくなります。そのテーブルに対するクエリでは、含めるすべての列の名前を指定する必要があります。

  • 生成された列に付与された SELECT は、基盤となるベース列に SELECT を付与しません。

  • インターリーブされたテーブルの場合、親テーブルに付与された SELECT は子テーブルには伝播されません。

  • 変更ストリームに対する SELECT を付与する場合は、変更ストリームのテーブル値関数に対する EXECUTE も付与する必要があります。詳細については、EXECUTE をご覧ください。

  • SELECT が特定の列(SUM(col_a) など)の集計関数で使用される場合、ロールには、それらの列に対する SELECT 権限が必要です。集計関数で列が指定されていない場合(COUNT(*) など)、ロールにはテーブル内の少なくとも 1 つの列に対する SELECT 権限が必要です。

  • シーケンスで SELECT を使用する場合は、表示権限が付与されているシーケンスのみ表示できます。

GRANT SELECT の使用例

GoogleSQL

GRANT SELECT ON TABLE employees TO ROLE hr_director;

GRANT SELECT ON TABLE customers, orders, items TO ROLE account_mgr;

GRANT SELECT(name, level, cost_center, location, manager) ON TABLE employees TO ROLE hr_manager;

GRANT SELECT(name, address, phone) ON TABLE employees, contractors TO ROLE hr_rep;

GRANT SELECT ON VIEW orders_view TO ROLE hr_manager;

GRANT SELECT ON CHANGE STREAM ordersChangeStream TO ROLE hr_analyst;

GRANT SELECT ON SEQUENCE sequence_name TO ROLE role_name;

PostgreSQL

GRANT SELECT ON TABLE employees TO hr_director;

GRANT SELECT ON TABLE customers, orders, items TO account_mgr;

GRANT SELECT(name, level, cost_center, location, manager) ON TABLE employees TO hr_manager;

GRANT SELECT(name, address, phone) ON TABLE employees, contractors TO hr_rep;

GRANT SELECT ON TABLE orders_view TO hr_manager; // orders_view is an invoker rights view

GRANT SELECT ON CHANGE STREAM orders_change_stream TO hr_analyst;

GRANT SELECT ON SEQUENCE sequence_name TO hr_package;

INSERT

指定されたテーブルに行を挿入できるようにします。列リストが指定されている場合、権限はそれらの列に対してのみ有効です。列リストが指定されていない場合、権限はテーブル内のすべての列で有効です。

  • 列名が指定されている場合、指定されていない列には挿入時にデフォルト値が設定されます。

  • 生成された列には INSERT を付与できません。

GRANT INSERT の使用例

GoogleSQL

GRANT INSERT ON TABLE employees, contractors TO ROLE hr_manager;

GRANT INSERT(name, address, phone) ON TABLE employees TO ROLE hr_rep;

PostgreSQL

GRANT INSERT ON TABLE employees, contractors TO hr_manager;

GRANT INSERT(name, address, phone) ON TABLE employees TO hr_rep;

UPDATE

指定されたテーブルの行の更新をロールに許可します。更新はテーブル列のサブセットに制限できます。これをシーケンスで使用すると、ロールはシーケンスで get-next-sequence-value 関数を呼び出すことができます。

このロールには、UPDATE 権限に加えて、クエリ対象のすべての列に対する SELECT 権限が必要です。クエリ対象の列には、WHERE 句の列が含まれます。

生成された列には UPDATE を付与できません。

GRANT UPDATE の使用例

GoogleSQL

GRANT UPDATE ON TABLE employees, contractors TO ROLE hr_manager;

GRANT UPDATE(name, address, phone) ON TABLE employees TO ROLE hr_rep;

PostgreSQL

GRANT UPDATE ON TABLE employees, contractors TO hr_manager;

GRANT UPDATE(name, address, phone) ON TABLE employees TO hr_rep;

DELETE

指定されたテーブルから行を削除する権限をロールに付与します。

  • DELETE は列レベルで付与できません。

  • また、ロールには、クエリの WHERE 句に含まれる可能性のある列に対する SELECT も必要です。

  • GoogleSQL 言語データベースのインターリーブされたテーブルの場合、DELETE 権限は親テーブルでのみ必要です。子テーブルで ON DELETE CASCADE が指定されている場合は、子テーブルに対する DELETE 権限がなくても、子テーブルの行が削除されます。

GRANT DELETE の使用例

GoogleSQL

GRANT DELETE ON TABLE employees, contractors TO ROLE hr_admin;

PostgreSQL

GRANT DELETE ON TABLE employees, contractors TO hr_admin;

EXECUTE

変更ストリームに対する SELECT を付与する場合は、変更ストリームの読み取り関数にも EXECUTE を付与する必要があります。詳細については、変更ストリーム読み取り関数とクエリ構文をご覧ください。

これをモデルで使用する場合、ML 関数でモデルを使用することをロールに許可します。

GRANT EXECUTE の使用例

次の例は、my_change_stream という名前の変更ストリームの読み取り関数に EXECUTE を付与する方法を示しています。

GoogleSQL

GRANT EXECUTE ON TABLE FUNCTION READ_my_change_stream TO ROLE hr_analyst;

PostgreSQL

GRANT EXECUTE ON FUNCTION spanner.read_json_my_change_stream TO hr_analyst;

USAGE

名前付きスキーマに USAGE を付与すると、名前付きスキーマに含まれるオブジェクトにアクセスする権限が付与されます。USAGE 権限は、デフォルトでデフォルト スキーマに付与されます。

次のステップ