GRANT SELECT简直无法使用

时间:2013-11-06 16:54:59

标签: sql postgresql

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

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

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

因此,只有您的#语句才会更改此数据库。

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

所以您需要做的就是以#用户身份运行psql proton,并在该特定数据库上以超级用户身份运行postgres语句。您的提示将显示为GRANT,表明您来对地方了。