无法将用户权限授予PostgreSQL数据库(用于Rails应用程序)

22

我仔细查阅了http://www.postgresql.org/docs/current/interactive/app-psql.html#APP-PSQL-META-COMMANDSfhttps://www.digitalocean.com/community/articles/how-to-use-roles-and-manage-grant-permissions-in-postgresql-on-a-vps--2,但仍无法使其正常工作。

我执行了以下步骤以使Postgres在本地运行:https://askubuntu.com/questions/42013/problem-installing-and-configuring-postgresql

pavan@myUbuntuLaptop% which psql
/usr/bin/psql

这使我进入了:

pavan@myUbuntuLaptop% sudo su - postgres
[sudo] password for pavan: 
postgres@myUbuntuLaptop% 

So...

postgres@myUbuntuLaptop% createuser pavankat
Shall the new role be a superuser? (y/n) y
postgres@myUbuntuLaptop% 

这会获取所有的角色

\du

显示 pavankat,因此该角色被创建。

这个可以工作:

postgres=# CREATE database lateraldev;
CREATE DATABASE
postgres=# \l

现在我尝试将权限授予给用户pavankat的lateraldev:

但这样是不起作用的:

GRANT RULE ON lateraldev to pavankat

无法工作:

GRANT ALL ON lateraldev TO pavankat;

无法正常运行:

postgres=# GRANT ALL ON lateraldev TO pavankat;
ERROR:  relation "lateraldev" does not exist

看起来它能工作,但是 \du 没有显示任何内容:

postgres=# GRANT ALL ON DATABASE lateraldev TO pavankat;
GRANT

与此相同,它并不能做到:
postgres=# GRANT ALL ON ALL TABLES IN SCHEMA public TO pavankat;
GRANT
postgres=# GRANT ALL ON ALL SEQUENCES IN SCHEMA public TO pavankat;
GRANT
postgres=# GRANT ALL ON ALL FUNCTIONS IN SCHEMA public TO pavankat;
GRANT
postgres=# \du

我使用了这篇文章:http://imaginaryrobots.wordpress.com/2010/03/10/grant-all-in-postgres/ 并将 shell 脚本复制到 Rails 应用程序中。
然后运行以下命令(使文件具有可执行权限):
pavan@myUbuntuLaptop% chmod 755 give_permissions_script.sh

而且它不起作用:

postgres@myUbuntuLaptop$ ./give_permissions_script.sh
GRANT ALL ON DATABASE lateraldev TO pavankat;
could not change directory to "/home/pavan/Dropbox/venturelateral"
could not change directory to "/home/pavan/Dropbox/venturelateral"

我尝试了这个:http://smokeandumami.com/2009/11/11/grant-permissions-on-all-tables-and-sequences-in-postgresql/,它似乎做了一些事情,但不起作用:

pavan@myUbuntuLaptop% chmod 755 give_permissions_script2.sh
pavan@myUbuntuLaptop% ./give_permissions_script2.sh
GRANT SELECT,UPDATE,DELETE,INSERT ON TABLE public.relname to pavankat;

请参见:

postgres=# grant all privileges on database lateraldev to pavan;
GRANT
postgres=# \du

这样也不行: 首先连接数据库:
postgres=# psql lateraldev

lateraldev=# GRANT ALL ON DATABASE lateraldev TO pavankat;
GRANT
lateraldev=# \du
                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 pavan     | Superuser, Create role, Create DB, Replication | {}
 pavankat  | Superuser, Create role, Create DB, Replication | {}
 postgres  | Superuser, Create role, Create DB, Replication | {}

我没有更多的想法了。请帮帮我?

圣诞快乐和节日愉快!


问题在于期望\du报告授予的权限,但它不会像\z\dn+等命令一样。请参阅psql的手册。 - Daniel Vérité
谢谢Daniel。我运行了这两个命令,甚至没有看到用户pavankat。所以我猜我运行的授权命令都没有起作用。你有什么想法,我该如何将权限授予我创建的用户? - Pavan Katepalli
展示你的脚本吗?我表示,问题在脚本里吗? - Малъ Скрылевъ
嘿,马乔亚,谢谢你的回复。我在上面链接了这些脚本。但是这里再次提供链接:http://imaginaryrobots.wordpress.com/2010/03/10/grant-all-in-postgres/ 和 http://smokeandumami.com/2009/11/11/grant-permissions-on-all-tables-and-sequences-in-postgresql/。 - Pavan Katepalli
我从网站上使用的脚本没有起作用。我在问题中提供了输出和结果。 - Pavan Katepalli
显示剩余2条评论
4个回答

25

你尝试过以下方法吗:

--Change the database ownership
alter database lateraldev owner to pavan;

--and do the same for all tables
psql -tc "select 'alter table ' || tablename || ' owner to pavan;' from pg_tables where schemaname not in ('pg_catalog', 'information_schema');" lateraldev | psql -a lateraldev

它起作用了!但你能稍微解释一下吗?我想更好地理解它... - Hari Honor

17

这就是我一直在寻找的答案。我不太明白为什么 GRANT 没有按预期工作,并出现了关系 "<tablename>" 不存在的错误。谢谢! - ffledgling

11

尝试创建一个具有CREATEDB权限的用户,然后您可以使用该用户创建数据库。从那时起,该用户将对该数据库拥有权限。

CREATE USER myuser CREATEDB;

我知道这不是一个完美的解决方案,但我希望这能对你有所帮助。

-Brian


谢谢,伙计。下次我需要同时创建新用户并分配权限时,我会使用这个。 - Pavan Katepalli

2

尝试将其作为psql命令发送。

psql -c "GRANT ALL ON lateraldev TO pavankat";

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接