web-dev-qa-db-ja.com

PostgreSQL:関係の許可が拒否されました

PostgreSQLでの権限の設定について少し混乱しています。

私には次の役割があります。

                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 admin     | Superuser, Create role, Create DB, Replication | {}
 meltemi   | Create role, Create DB                         | {Rails}
 Rails     | Create DB, Cannot login                        | {}
 myapp     |                                                | {Rails}

およびデータベース:

                                    List of databases
        Name         | Owner  | Encoding |   Collate   |    Ctype    | Access privileges 
---------------------+--------+----------+-------------+-------------+-------------------
 myapp_production    | Rails  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ...

ユーザーmyappは、レコードの追加と削除を行うmyapp_productionデータベースのクエリに問題はありません。 meltemiも同じデータベースをクエリできるようにしたいと思います。そこで、データベースを所有するロールRailsを作成し、meltemimyappの両方のメンバーをRailsのメンバーにしました。それでもpermission denied for relationエラーが発生します。 Meltemiはスキーマを表示できますが、DBをクエリできません。

\dtコマンドを使用して)myappがテーブルの所有者であることに気づきました。

             List of relations
 Schema |       Name        | Type  | Owner 
--------+-------------------+-------+-------
 public | events            | table | myapp
 public | schema_migrations | table | myapp
 ...
 public | users             | table | myapp
 ...

テーブルはORM(RailsのActiveRecordマイグレーション)を介して作成されました。

承認はPostgreSQLで非常に異なることを知っています(MySQLなど、私が使用したものとは対照的です)。さまざまなユーザーがアクセスできるようにデータベースを設定するにはどうすればよいですか。一部はCRUDを実行できるはずですが、他のユーザーは読み取りのみを実行できる場合などがあります。

助けてくれてありがとう。申し訳ありませんが、これは非常に基本的な質問であることはわかっていますが、自分で答えを見つけることができませんでした。

14
Meltemi

これについて、ServerFaultの postgresqlデータベースに対する権限を別のユーザーに付与する に対する私の回答に書いたところです。

基本的に、1人のユーザーがいて、他のユーザーに同じ権限を与えたい場合の最良の解決策は、そのユーザーをグループにして、グループのメンバーである元のユーザーと同じ名前で新しいユーザーを作成することです。そのグループを他のユーザーにも許可します。

したがって、あなたの場合、Railsは_myapp_users_と改名され、Railsおよび_GRANT myapp_users TO Rails_という名前の新しいログインロール(ユーザー)を作成します。あなたは_GRANT myapp_users TO meltemi_になりました。新しいRailsアカウントとmeltemiユーザーの両方に、古いRailsaccountの権限が付与されました。

より細かい制御のために、私は通常、日常のログインユーザーまたはそのグループにテーブルの所有権を与えないことをお勧めします。 NOINHERITグループを介してアクセス権を与えるには、明示的に_SET GROUP_する必要があります。DDLやGRANTsなどの特権操作には完全に異なるユーザーを使用する必要があります。残念ながら、これはRailsでは機能しません。なぜなら、Railsは、必要に応じて移行を適用することを好み、AFAIKでは、より特権の高い別のユーザーを指定して、移行として。

4
Craig Ringer