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


91

PostgreSQL 9.0を使用して、「スタッフ」というグループの役割を持っています。特定のスキーマのテーブルで、この役割にすべての(または特定の)特権を付与したいと考えています。次の作業はありません

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

「スタッフ」のメンバーは、まだデータベース内の任意のテーブルに(2番目のコマンドの場合)、スキーマ「foo」というか、個々のテーブルで選択することができない、またはUPDATEある場合を除き、私はその特定のテーブルの上にすべてを付与します。

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

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

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

回答:


120

指定されたスキーマ内のすべての既存のテーブルに権限を設定するための省略形が見つかりました。マニュアルは明確にします:

(ただし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スクリプトをコピーするときは、手動で句を調整してください。


2
あなたがアーウィンを知っているように、あなたがあなたのアドバイスを投稿してから10分後、私はそれが必要でした。それはあなたが私が何をしようとしているのか知っていたようです...新しいテーブルを作成して、適切な特権がなかったことがわかりました。あなたの答えが助けになりました。
punkish


実行ALTER DEFAULT PRIVILEGES IN SCHEMA foo GRANT ALL PRIVILEGES ON TABLES TO staff;すると、どのデータベースがどのようにしてわかりますか?SCHEMA foo別のデータベースに存在できますか?
J86、2018年

2
@ J86:コマンドが実行される現在のデータベースにのみ適用されます。
Erwin Brandstetter

1
@ErwinBrandstetter テーブルが別の専用のmigration_userによって自動的に作成される(フライウェイマイグレーションがアプリの起動時に実行される)場合、将来のテーブル/シーケンスへのアクセスをapp_user(読み取り/書き込み)に許可できますか?
語彙素

43

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

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

詳細については、質問「スキーマでの適切な使用法」を参照してください。。PostgresのエキスパートであるCraig Ringerの回答に特に注意してください

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

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


1
上記の2つの付与に加えて、もう1つの付与が必要です。GRANT USAGE ON SCHEMA public TO some_user_;
寧劉

1
@NingLiu GRANT USAGEを指摘し、教えてくれてありがとう。回答にセクションを追加しました。
バジルブルク2015

スキーマでの使用の許可は、私が探していたものです。
バジルムーサ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.