web-dev-qa-db-ja.com

データベース内の特定のスキーマのすべてをPostgreSQLのグループロールに付与します

PostgreSQL 9.0を使用して、 "staff"というグループロールがあり、特定のスキーマのテーブルでこのロールにすべての(または特定の)権限を付与したいと考えています。次の作業はありません

GRANT ALL ON SCHEMA foo TO staff;
GRANT ALL ON DATABASE mydb TO staff;

「staff」のメンバーは、スキーマ「foo」内の個々のテーブルで(2番目のコマンドの場合)データベース内のテーブルを選択または更新することはできませんその特定のテーブルのすべてを許可します。

自分とユーザーの生活を楽にするために何ができますか?

更新:serverfault.comでの同様の質問 の助けを借りてそれを見つけ出しました。

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;
75
punkish

指定されたスキーマ内のすべてのexistingテーブルに特権を設定するための短縮形を見つけました。 マニュアルで明確化

(ただし、ALL TABLESviewsおよびforeign tablesを含むと見なされることに注意してください)。

大胆な強調鉱山。 serial列は、列のデフォルトとしてシーケンスのnextval()で実装され、 マニュアルを引用

シーケンスの場合、この特権はcurrvalおよびnextval関数の使用を許可します。

したがって、serial列がある場合は、USAGE(またはALL PRIVILEGES)をsequencesに付与することもできます。

GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;

注: identities columns Postgres 10以降では、追加の特権を必要としない暗黙的なシーケンスを使用します。 (serial列のアップグレードを検討してください。)

newオブジェクトはどうですか?

DEFAULT PRIVILEGESユーザーまたはスキーマの場合

ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT USAGE          ON SEQUENCES TO staff;
ALTER DEFAULT PRIVILEGES IN SCHEMA foo REVOKE ...;

これにより、将来作成されるオブジェクトの特権が自動的に設定されますが、既存のオブジェクトの特権は設定されません。

デフォルトの権限は、onlyが対象ユーザー(FOR ROLE my_creating_role)によって作成されたオブジェクトに適用されます。その句が省略された場合、デフォルトでALTER DEFAULT PRIVILEGESを実行している現在のユーザーになります。明示的にするには:

ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo GRANT ...;
ALTER DEFAULT PRIVILEGES FOR ROLE my_creating_role IN SCHEMA foo REVOKE ...;

また、pgAdmin IIIのすべてのバージョンには、現在のロールに適用されない場合でも、SQLペインに微妙なバグとdisplayデフォルト権限があることに注意してください。 SQLスクリプトをコピーするときは、必ずFOR ROLE句を手動で調整してください。

103

私の答えは ServerFault.comのこれ に似ています。

保守的になる

「すべての特権」を付与するよりも保守的になりたい場合は、次のようなものを試してください。

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO some_user_;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO some_user_;

publicの使用は、すべての新しいデータベース/カタログに対して作成されるデフォルトスキーマの名前を指します。スキーマを作成した場合は、自分の名前に置き換えます。

スキーマへのアクセス

スキーマにアクセスするには、何らかのアクションのために、ユーザーに「使用」権限を付与する必要があります。ユーザーが選択、挿入、更新、または削除を行う前に、まずユーザーにスキーマの「使用」を許可する必要があります。

初めてPostgresを使用するとき、この要件に気付かないでしょう。デフォルトでは、すべてのデータベースにはpublicという名前の最初のスキーマがあります。デフォルトでは、すべてのユーザーにその特定のスキーマへの「使用」権限が自動的に付与されています。追加のスキーマを追加する場合、使用権を明示的に付与する必要があります。

GRANT USAGE ON SCHEMA some_schema_ TO some_user_ ;

Postgres doc からの抜粋:

スキーマの場合、指定されたスキーマに含まれるオブジェクトへのアクセスを許可します(オブジェクト自体の特権要件も満たされていると仮定)。基本的に、これにより、被付与者はスキーマ内のオブジェクトを「ルックアップ」できます。この許可がなくても、オブジェクト名を表示することは可能です。システムテーブルをクエリします。また、この許可を取り消した後、既存のバックエンドは以前にこのルックアップを実行したステートメントを持っている可能性があるため、これはオブジェクトアクセスを防止する完全に安全な方法ではありません。

詳細については、質問 SchemaのGRANT USAGEが正確に行うこと を参照してください。 回答 Postgresのエキスパートによる Craig Ringer に特に注意してください。

既存のオブジェクトと未来

これらのコマンドは、既存のオブジェクトにのみ影響します。将来作成するテーブルなどは、上記の行を再実行するまでデフォルトの特権を取得します。 Erwin Brandstetterによる他の回答 を参照して、デフォルトを変更し、将来のオブジェクトに影響を与えます。

37
Basil Bourque