111

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

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

「staff」のメンバーは、スキーマ「foo」内の個々のテーブル、または (2 番目のコマンドの場合) データベース内の任意のテーブルに対して、その特定のテーブルですべてを許可しない限り、SELECT または UPDATE を実行できません。

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

更新: serverfault.comの同様の質問の助けを借りてそれを理解しました。

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA foo TO staff;
4

2 に答える 2

143

指定されたスキーマ内の既存のすべてのテーブルに特権を設定する省略形を見つけました。マニュアルは次のことを明確にしています。

(ただし、ビュー外部テーブルALL TABLESを含むと見なされることに注意してください)。

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

シーケンスの場合、この権限によりcurrvalおよびnextval関数を使用できます。

したがって、列がある場合は、シーケンスserialにも付与USAGE(またはALL PRIVILEGES)する必要があります

GRANT USAGE ON ALL SEQUENCES IN SCHEMA foo TO mygrp;

注: Postgres 10 以降のID 列は、追加の特権を必要としない暗黙的なシーケンスを使用します。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 ...;

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

デフォルトの権限は、対象ユーザー ( ) によって作成されたオブジェクトにのみ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 ペインにデフォルトの権限が表示されることに注意してください。FOR ROLESQL スクリプトをコピーするときは、句を手動で調整してください。

于 2012-04-27T15:46:18.900 に答える
49

私の答えは、 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からの抜粋:

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

詳細については、質問「GRANT USAGE ON SCHEMA は正確には何をしますか?」を参照してください。. Postgres の専門家であるCraig RingerによるAnswerに特に注意してください。

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

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

于 2014-07-06T06:29:46.117 に答える