4

我有一个用户需要允许SELECT访问数据库。我已经按照我发现的所有说明进行了操作,但我什么也做不了。

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

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

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

关系的权限被拒绝

...以及更多对 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、和。我有一个旧转储,并且能够授予只读访问权限。我删除了数据库并使用更新版本的数据库进行了 pg_restore,现在我无法重新授予 SELECT 访问权限。ORDER BYLIMITJOIN

任何帮助将不胜感激。

4

1 回答 1

5

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

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

因此,您的GRANT语句只会更改此数据库。

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

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

于 2013-11-06T20:21:42.530 回答