可以实现以下伪代码的东西:
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;
这是链接。
#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
评论
我会尽快升级,所以这确实是个好消息。谢谢!
–亚当·马坦(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