有没有一种单行代码可以将SELECT权限授予新用户postgresql?

可以实现以下伪代码的东西:

GRANT SELECT ON TABLE * TO my_new_user;


#1 楼

我认为应该提到一下,从9.0开始,postgres确实具有在架构中授予所有表(以及其他对象)特权的语法:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO user;


这是链接。

评论


我会尽快升级,所以这确实是个好消息。谢谢!

–亚当·马坦(Adam Matan)
2011年6月26日15:31

这会影响服务器上使用公共架构的所有数据库吗?

– kristianp
2014年5月28日7:20

如果我创建一个新表,此用户是否可以访问新创建的表?

–GuiSim
2014年9月5日19:13

@GuiSim否,您必须在模式上设置默认权限,ytou会在其中创建表:postgresql.org/docs/current/static/…

– SkyRaT
16年1月24日在9:33

@kristianp不,PG集群中的每个数据库都有其自己的公共架构。它会影响您要连接到的当前数据库的公共模式中的所有表(函数)。

– SkyRaT
16年1月24日在9:36

#2 楼

我的(单线)解决方案:

#!/bin/bash

for table in `echo "SELECT schemaname || '.' || relname FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
    echo "GRANT SELECT ON TABLE $table to my_new_user;"
    echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done


从特权用户运行,它像一种魅力。

评论


如果使用pg_stat_user_tables而不是all_tables,则不需要grep...。此外,将-A -t传递给psql以摆脱格式化输出。

– Magnus Hagander
09年8月30日在18:33

请注意,从Postgres 9.0开始,此答案的方法很难做到。在9.x中,我们现在在另一个答案中看到了“ ON ALL”。

–罗勒·布尔克
2014年7月6日在5:48



在表或模式名称包含大写字母的情况下,此功能不起作用。在下面添加修改的版本

–附件
19-3-26在19:11



#3 楼

这可以通过两步过程完成。



运行此查询:

select 'grant all on '||schemaname||'.'||tablename||' to $foo;'
from pg_tables where schemaname in ('$bar', '$baz')
order by schemaname, tablename;


替换:

$foo =您要授予$bar权限的用户名,$baz =您要授予其权限的模式(可以是“公共”)

这将为您提供将生成所需权限的查询列表。复制输出,将其粘贴到另一个查询中,然后执行。


#4 楼

我最终这样做了,它成功了:

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO PUBLIC;


评论


以后创建表时非常好,并且默认情况下应授予读取访问权限

– arhak
20 May 16 '13:10

#5 楼

这就是我用的:

psql dbname -tc "select 'grant select on '||relname||' to readonly;' from pg_stat_user_tables" | psql dbname


我觉得在sql中进行格式化和在哪里使用子句更自然。.

#6 楼

我正在使用Postgres 8.4,并将所有特权授予用户,请执行以下操作:

#!/bin/bash

for table in `echo "SELECT schemaname||'.'||relname FROM pg_stat_all_tables WHERE schemaname NOT IN('pg_catalog','pg_toast','information_schema')" | psql -t db `;
do
    echo "grant select on table $table to my_new_user;"
    echo "grant select on table $table to my_new_user;" | psql db
done


评论


请用英文。

–歌手
2012年11月30日14:14

#7 楼

解决此问题的一种方法是编写存储过程。不幸的是,没有“授予所有表所有内容”命令。
您可能确实需要一个过程或一些外部Shell脚本才能使此工作生效。

#8 楼

当存在许多架构时,Adam Matan的(单行解决方案)脚本非常有用,但是在架构名称或表名称包含大写字母或特殊字符的情况下,该脚本不起作用。

修改版本:

#!/bin/bash

for table in `echo "SELECT '\"' || schemaname || '\".\"' || relname || '\"'  FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
    echo "GRANT SELECT ON TABLE $table to my_new_user;"
    echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done