GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
只读用户可以连接,请参阅表,但是当尝试进行简单选择时,它会得到:
ERROR: permission denied for relation mytable
SQL state: 42501
这是在PostgreSQL 9.1上发生的
我做错了什么?
Answers:
这是最近更新的PostgreSQL 9+的完整解决方案。
CREATE USER readonly WITH ENCRYPTED PASSWORD 'readonly';
GRANT USAGE ON SCHEMA public to readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;
-- repeat code below for each database:
GRANT CONNECT ON DATABASE foo to readonly;
\c foo
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly; --- this grants privileges on new tables generated in new database "foo"
GRANT USAGE ON SCHEMA public to readonly;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
感谢https://jamie.curle.io/creating-a-read-only-user-in-postgres/的几个重要方面
如果有人发现较短的代码,并且最好是能够为所有现有数据库执行此代码的代码,则额外的荣誉。
GRANT ALL
默认将权限授予只读用户?
\ddp
。如果只显示=r/
像granting_user=r/readonly_user
为只读访问。
尝试添加
GRANT USAGE ON SCHEMA public to readonly;
您可能不知道,为了使用架构中的对象,需要具有对架构的必需权限。
psql
以postgres
用户身份在服务器上运行这些命令,但确实得到了正确的响应GRANT
。不过,当我查看表上的ACL时,我仅看到另外两个帐户,一个是数据库所有者jirauser
,另一个是名为的只读帐户qauser
。但是我readonly
没有出现在那。Postgres是9.1版,我什至重新启动了服务器,仍然没有任何反应。
这为我工作:
通过使用以下命令检查当前登录的角色:SELECT CURRENT_USER,SESSION_USER;
注意:它必须与模式的所有者匹配。
架构| 姓名| 类型 所有者
-------- + -------- + ------- + ----------
如果所有者不同,那么可以通过admin角色将所有授予从admin角色授予当前用户角色:
将“ ROLE_OWNER”授予“ CURRENT ROLENAME”;
然后尝试执行查询,它将提供输出,因为它现在可以访问所有关系。
确保您的用户具有其角色的属性。例如:
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
flux | | {}
postgres | Superuser, Create role, Create DB, Replication | {}
执行以下命令后:
postgres=# ALTER ROLE flux WITH Superuser;
ALTER ROLE
postgres=# \du
List of roles
Role name | Attributes | Member of
-----------+------------------------------------------------+-----------
flux | Superuser | {}
postgres | Superuser, Create role, Create DB, Replication | {}
它解决了问题。
在此处查看角色和内容的教程:https : //www.digitalocean.com/community/tutorials/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2
ERROR: permission denied for relation mytable