Postgresql:DATABASEのGRANT ALL PRIVILEGESは何をしますか?


60

特定のデータベースのすべてのテーブルに対するすべての特権を、新しい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)すべてのテーブルに対するすべての権限をユーザーに付与する適切な方法は何ですか?(将来作成されるすべてのテーブルを含む)

回答:


80

あなたの質問への答えは、オンラインのPostgreSQL 8.4ドキュメントから来ています

  1. GRANT ALL PRIVILEGES ON DATABASE付与CREATECONNECTおよびTEMPORARY役割のデータベースに対する権限を(ユーザーが適切と呼ばれている役割)。これらの特権はどれも、ロールがテーブルからデータを読み取ることを実際に許可しません。SELECTそのためには、テーブルに対する特権が必要です。

  2. すべてのテーブルのすべての特権をロールに付与する「適切な」方法があるかどうかはわかりません。特定のロールがテーブルに対するすべての特権を持っていることを確認する最良の方法は、ロールテーブルを所有していることを確認することです。デフォルトでは、新しく作成されたすべてのオブジェクトは、それを作成したロールによって所有されます。したがって、ロールにテーブルに対するすべての特権を持たせる場合は、そのロールを使用して作成します。

    PostgreSQL 9.0では、ほぼ必要な次の構文が導入されています。

    GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO new_user;

    問題は、デフォルトの「パブリック」スキーマ以外のスキーマでテーブルを作成する場合、これGRANTは適用されないということです。非公開スキーマを使用する場合はGRANT、それらのスキーマに対する権限を個別に取得する必要があります。


1
データベースに複数の所有者を設定できますか?もしそうなら、別の所有者を追加するには?
rz。

いいえ、データベースに複数の所有者がいるとは思わないが、所有者のすべての書き込みをそれらに与えることができる
-hellomynameisjoel

15
シーケンスで同じことをする必要があることを忘れないでください。GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO your_user;または、レコードを挿入できません。

うまくいかなくても、これを試してください:= SCHEMAのすべてのテーブルのすべての特権をyour_userに付与します。
-Kaustubh

10

データベース所有者として機能する複数のログインを設定することができます。

  • 所有者として機能する「nologin」ロールを作成します。 create role dbowner nologin
  • データベースの所有者を次のように変更します。 alter database mydb owner dbowner
  • この新しい役割へのすべてのログインを許可します。 grant dbowner to user1, user2

これで、user1またはuser2のいずれかがログインした場合、追加の許可なしで「mydb」に対するすべての権限が付与されます。

ただし、このソリューションは慎重に検討します。Webアプリケーションでこれらのログインのいずれかを使用して、スキーマが更新されるたびに追加の許可を作成する苦痛を回避するのは魅力的ですが、この方法で非常に便利な保護を削除することになります。複数の「管理者」が本当に必要な場合は、上記のソリューションを使用しますが、「通常の使用」アプリケーションのログインについては、「スキーマ内のすべてのテーブルのすべての特権を付与する...」パターンに固執します。


1
ほんの少しの修正クリスCogdon、:mydbデータベースの所有者を変更するのdbowner
user876743
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.