关于sql:GRANT SELECT简直无法正常工作

GRANT SELECT Simply not working

我有一个用户,我需要允许SELECT访问数据库。我已经按照我发现散布的所有说明进行了操作,我无法正常工作。

我已经尝试了所有以下链接的建议解决方案:

如何在PostgreSQL中创建只读用户?

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

关系允许被拒绝

......以及对PSQL文档,博客和用户组的更多参考。什么都行不通。

以下是我最近用作授予权限的postgres用户的命令:

1
2
3
4
5
6
7
8
9
10
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

以下是用作只读用户的命令:

1
2
3
4
5
6
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。我们介绍了简单的命令,如SELECTORDER BYLIMITJOIN。我有一个旧的转储,并能够授予只读访问权限。我删除了数据库并使用较新版本的数据库执行了pg_restore,现在我无法重新授予SELECT访问权限。

任何帮助将不胜感激。


在PostgreSQL中,每个连接都是针对特定的数据库,并且您运行的几乎所有内容都只在该数据库中生效。 (一个例外是用户/角色本身的创建对于整个"集群"是全局的,即运行Postgres服务器。)

在您显示的psql命令中,第一次连接而不指定数据库(psql),该数据库将您连接到以当前系统用户命名的数据库,即postgres。这显示在psql提示符的开头:postgres=#(#表示您以超级用户身份连接)。

因此,只有这个数据库才会被GRANT语句更改。

您的第二个示例使用正确的命令连接到特定数据库psql proton,您可以看到提示反映了这一点:proton=>(>替换#,因为您没有连接到超级用户)。

因此,您需要做的就是以postgres用户身份运行psql proton,并在该特定数据库上以超级用户身份运行GRANT语句。您的提示将显示proton=#,表明您在正确的位置。