错误:尝试将SELECT作为只读用户时,对Postgres上的关系表名的权限被拒绝


89
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

只读用户可以连接,请参阅表,但是当尝试进行简单选择时,它会得到:

ERROR: permission denied for relation mytable
SQL state: 42501

这是在PostgreSQL 9.1上发生的

我做错了什么?


1
您能否提供有关“ mytable关系”的一些详细信息?模式,它是一个“真实的”表(或视图/函数),触发...
Igor Romanchenko

Answers:


162

这是最近更新的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/的几个重要方面

如果有人发现较短的代码,并且最好是能够为所有现有数据库执行此代码的代码,则额外的荣誉。


6
这包括视图吗?
Frank Conry 2014年

9
您为什么GRANT ALL默认将权限授予只读用户?
Slava Fomin II

1
我给出的定义完全正确,仍然是sam错误
Anish Gopinath

可以确认使用授予的权利\ddp。如果只显示=r/granting_user=r/readonly_user为只读访问。
格雷格·布雷

这是问题的逐字记录SQL。我看不到它如何提供解决方案。
r351574nc3

12

尝试添加

GRANT USAGE ON SCHEMA public to readonly;

您可能不知道,为了使用架构中的对象,需要具有对架构的必需权限。


发生了一些奇怪的事情,我psqlpostgres用户身份在服务器上运行这些命令,但确实得到了正确的响应GRANT。不过,当我查看表上的ACL时,我仅看到另外两个帐户,一个是数据库所有者jirauser,另一个是名为的只读帐户qauser。但是我readonly没有出现在那。Postgres是9.1版,我什至重新启动了服务器,仍然没有任何反应。
sorin 2012年

2
在psql控制台中\ du的输出是什么?您是否仍然可以提供此输出,或者已经像您的答案中那样将其修复了?
2012年

我真的不知道发生了什么,因为输出正确(GRANT)。昨天它不起作用,但是今天它在再次运行所有3个命令后才起作用。
索林2012年

3
注意:对此预期的停留只是“ GRANT”。如果看到“警告:没有为“公共”授予特权”,则该DID不起作用。只读用户无法为其授予额外的权限。只有具有“ GRANT”权限的用户才能执行此操作,因此您可能需要以超级用户身份登录。
PeterVermont

嗨,当我尝试在SCHEMA中授予对所有表的选择时,请公共转给postgres;它响应:错误:关系数据库更改日志锁的权限被拒绝。你知道我在做什么吗?谢谢(在GAppEngine Posgres9.6上使用公共地址并通过终端访问)
Mike

-5

这为我工作:

通过使用以下命令检查当前登录的角色:SELECT CURRENT_USER,SESSION_USER;

注意:它必须与模式的所有者匹配。

架构| 姓名| 类型 所有者
-------- + -------- + ------- + ----------

如果所有者不同,那么可以通过admin角色将所有授予从admin角色授予当前用户角色:

将“ ROLE_OWNER”授予“ CURRENT ROLENAME”;

然后尝试执行查询,它将提供输出,因为它现在可以访问所有关系。


5
将所有者更改为名为只读的用户听起来像是正确的解决方案。
安娜

根据您的情况,错误的表所有者确实可能是原因(这是我的仇敌)。在PostgreSQL中更改表
ownerhiip的

-6

确保您的用户具有其角色的属性。例如:

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


18
没有!将超级用户角色授予名为“只读”的用户以进行“选择”不是正确的解决方法。
安娜

@Anna这不是这里发生的事情。该线程与授予只读访问权限无关。该线程是关于授予用户访问权限以授予另一用户只读访问权限。恕我直言,这是正确的。如果您的用户不是超级用户,则不能创建只读用户。由于能够创建只读用户而引起的错误ERROR: permission denied for relation mytable
r351574nc3

-7

您应该执行下一个查询:

GRANT ALL ON TABLE mytable TO myuser;

或者,如果您的错误在视图中,则表可能没有权限,因此您应该执行下一个查询:

GRANT ALL ON TABLE tbm_grupo TO myuser;

5
用户称为“只读”。向用户授予所有权限是目标,这令人怀疑。他只是想做一个选择。
安娜

如果您要提供ALTER DROP DELETEEct,则无法实现将用户命名为“ ReadOnly”的目的。给那个用户...
JayRizzo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.