特定のデータベースのすべてのテーブルに対するすべての権限を、所有者ではなく新しいpostgresユーザーに付与しようとしています。のようだ GRANT ALL PRIVILEGES ON DATABASE my_db TO new_user;
はそれを行いません。上記のコマンドを(postgresユーザーとして)正常に実行した後、new_userとして以下を取得します。
$ psql -d my_db
my_db => SELECT * FROM a_table_in_my_db;
ERROR: permission denied for relation a_table_in_my_db
2つの質問:
1)my_dbのすべてのテーブルに対するすべての権限を付与しない場合、上記のコマンドは何をしますか?
2)すべてのテーブルに対するすべての権限をユーザーに付与する適切な方法は何ですか? (将来作成されるすべてのテーブルを含む)
あなたの質問に対する答えは online PostgreSQL 8.4 docs から得られます。
GRANT ALL PRIVILEGES ON DATABASE
は、データベースに対するCREATE
、CONNECT
、およびTEMPORARY
特権をロールに付与します(ユーザーはroles)。これらの特権は、実際にはロールがテーブルからデータを読み取ることを許可していません。そのためには、テーブルに対するSELECT
特権が必要です。
すべてのテーブルのすべての権限をロールに付与する「適切な」方法があるかどうかはわかりません。特定のロールがテーブルに対するすべての権限を持っていることを確認する最良の方法は、ロールがテーブルを所有することを保証することです。デフォルトでは、新しく作成されたすべてのオブジェクトは、それを作成したロールによって所有されているため、テーブルに対するすべての権限をロールに持たせたい場合は、そのロールを使用して作成します。
PostgreSQL 9.0は、ほぼの構文である次の構文を導入しています。
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;
問題は、デフォルトの「パブリック」スキーマ以外のスキーマでテーブルを作成する場合、このGRANT
はそれらに適用されないことです。非公開スキーマを使用する場合は、それらのスキーマに対する権限を個別にGRANT
する必要があります。
データベース所有者として機能するように複数のログインを設定することが可能です。
create role dbowner nologin
alter database mydb owner dbowner
grant dbowner to user1, user2
これで、user1またはuser2のいずれかがログインすると、「mydb」に対するすべての権限が付与され、追加の権限は必要ありません。
ただし、このソリューションは慎重に検討します。スキーマが更新されるたびに追加の権限を作成する手間を省くために、Webアプリケーションでこれらのログインの1つを使用するのは魅力的ですが、この方法で非常に便利な保護形式を削除します。複数の「管理者」が本当に必要な場合は、上記のソリューションを使用しますが、「通常の使用」アプリケーションのログインでは、上記の「スキーマ内のすべてのテーブルに対するすべての権限を付与する...」のパターンを使用します。