PostgreSQL:关系的权限被拒绝

Mel*_*emi 14 postgresql authorization permissions role

我对在 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}
Run Code Online (Sandbox Code Playgroud)

和数据库:

                                    List of databases
        Name         | Owner  | Encoding |   Collate   |    Ctype    | Access privileges 
---------------------+--------+----------+-------------+-------------+-------------------
 myapp_production    | rails  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ...
Run Code Online (Sandbox Code Playgroud)

用户myapp在查询myapp_production数据库添加和删除记录时没有问题。我希望meltemi也能够查询相同的数据库。所以,我创建了一个角色rails拥有的数据库,并提出双方meltemimyapp成员rails。但我仍然遇到permission denied for relation错误。Meltemi可以查看架构但不能查询数据库。

我刚刚注意到(使用\dt命令)这myapp是表的所有者:

             List of relations
 Schema |       Name        | Type  | Owner 
--------+-------------------+-------+-------
 public | events            | table | myapp
 public | schema_migrations | table | myapp
 ...
 public | users             | table | myapp
 ...
Run Code Online (Sandbox Code Playgroud)

这些表是通过 ORM(Rails 的 ActiveRecord 迁移)创建的。

我知道 PostgreSQL 中的授权非常不同(与我使用的 MySQL 和其他人相反)。我应该如何设置我的数据库以便不同的用户可以访问它。有些应该能够 CRUD,但其他人可能只能阅读,等等......

谢谢你的帮助。抱歉,我知道这是一个非常基本的问题,但我自己无法找到答案。

Cra*_*ger 4

我刚刚在对将 postgresql 数据库的权限授予 ServerFault 上的另一个用户的回答中写到了这一点。

基本上,当您拥有单个用户并且想要授予其他用户相同的权限时,最好的解决方案是将该用户转变为一个组,创建一个与作为该组成员的原始用户同名的新用户,然后也将该组授予其他用户。

因此,在您的情况下,rails被重命名为 say ,然后您创建一个名为和myapp_users的新登录角色(用户)。现在你一个. 新帐户和用户现在都拥有旧帐户的权限。railsGRANT myapp_users TO railsGRANT myapp_users TO meltemirailsmeltemirails

为了进行更细粒度的控制,我通常建议您避免将表的所有权授予日常登录用户或其组。NOINHERIT通过他们必须明确访问的组为他们提供访问SET GROUP权限,或者更好的是,使用完全不同的用户进行 DDL 和GRANTs 等特权操作。不幸的是,这不适用于 Rails,因为 Rails 喜欢在需要时应用迁移,并且 AFAIK 不允许您指定不同的、权限更高的用户来运行迁移。