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;
指定されたスキーマ内のすべてのexistingテーブルに特権を設定するための短縮形を見つけました。 マニュアルで明確化 :
(ただし、
ALL TABLES
はviewsおよび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
列のアップグレードを検討してください。)
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
句を手動で調整してください。
私の答えは 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による他の回答 を参照して、デフォルトを変更し、将来のオブジェクトに影響を与えます。