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

sor*_*rin 86 postgresql

GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
Run Code Online (Sandbox Code Playgroud)

readonly用户可以连接,查看表,但是当它尝试进行简单的选择时,它会获得:

ERROR: permission denied for relation mytable
SQL state: 42501
Run Code Online (Sandbox Code Playgroud)

这发生在PostgreSQL 9.1上

我做错了什么?

sor*_*rin 152

这是最近更新的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;
Run Code Online (Sandbox Code Playgroud)

感谢https://jamie.curle.io/creating-a-read-only-user-in-postgres/的几个重要方面

如果有人找到更短的代码,并且最好是能够为所有现有数据库执行此操作的代码,则需要额外的荣誉.

  • 为什么默认情况下将"GRANT ALL"权限授予只读用户? (8认同)
  • 这包括观点吗? (6认同)

suf*_*leR 12

尝试添加

GRANT USAGE ON SCHEMA public to readonly;
Run Code Online (Sandbox Code Playgroud)

您可能不知道需要拥有模式的必需权限才能使用模式中的对象.

  • 注意:对此的预期设置只是'GRANT'.如果您看到'警告:没有为"公共"授予任何权限,那么它就无法正常工作.用户readonly无法授予自己额外的权限.只有具有"GRANT"权限的用户才能这样做,因此您可能需要以超级用户身份登录. (3认同)
  • 在psql控制台中\ du的输出是什么?你还可以提供这个输出,或者它已经像你的回答一样修复了吗? (2认同)