このページでは、きめ細かいアクセス制御のためにデータベースのロールに付与できる権限について説明します。この情報は、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
権限は、デフォルトでデフォルト スキーマに付与されます。
次のステップ
- きめ細かいアクセス制御を構成する
- きめ細かいアクセス制御の概要
- GRANT ステートメントと REVOKE ステートメント(GoogleSQL 言語データベース)
- GRANT ステートメントと REVOKE ステートメント(PostgreSQL 言語データベース)