我有一个用户需要允许SELECT
访问数据库。我已经按照我发现散布的所有说明进行了操作,但我无法正常工作。
我已经尝试了以下所有链接的所有建议解决方案:
How do you create a read-only user in PostgreSQL?
ERROR: permission denied for relation tablename on Postgres while trying a SELECT as a readonly user
Permission denied for relation
...还有更多对PSQL文档,博客和用户组的引用。没有什么工作。
以下是我最近用作授予权限的postgres用户的命令:
postgres@dev:~$ psql
psql (9.1.9)
Type "help" for help.
postgres=# grant usage on SCHEMA public to proton_read;
GRANT
postgres=# grant select on all tables in schema public to proton_read;
GRANT
postgres=# alter default privileges in schema public grant select on tables to proton_read;
ALTER DEFAULT PRIVILEGES
以下是用作只读用户的命令:
proton_read@dev:~$ psql proton
psql (9.1.9)
Type "help" for help.
proton=> select * from leads_lead limit 1;
ERROR: permission denied for relation leads_lead
这是踢球者,我曾经做过一次。我有一个示例数据库转储,我用它来向业务同事讲授基本的SQL。我们介绍了SELECT
,ORDER BY
,LIMIT
和JOIN
等简单命令。我有一个旧的转储,并能够授予只读访问权限。我删除了数据库并使用较新版本的数据库执行了pg_restore,现在我无法重新授予SELECT访问权限。
非常感谢任何帮助。
答案 0 :(得分:4)
在PostgreSQL中,每个连接都是针对特定的数据库,并且您运行的几乎所有内容都只在该数据库中生效。 (一个例外是用户/角色本身的创建对于整个“集群”是全局的,即运行Postgres服务器。)
在您显示的psql
命令中,您是第一次连接而未指定数据库(psql
),它将您连接到以当前系统用户命名的数据库,{{1 }}。这显示在postgres
提示符的开头:psql
(postgres=#
表示您以超级用户身份连接。)
因此,只有您的#
语句才会更改此数据库。
您的第二个示例使用正确的命令连接到特定数据库GRANT
,您可以看到提示反映了这一点:psql proton
(proton=>
替换>
1}},因为您没有以超级用户身份连接。)
所以您需要做的就是以#
用户身份运行psql proton
,并在该特定数据库上以超级用户身份运行postgres
语句。您的提示将显示为GRANT
,表明您来对地方了。