题 GRANT SELECT到postgresql中的所有表


是否有一个允许的单行班轮 SELECT权限 到了 新用户 PostgreSQL的?

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

GRANT SELECT ON TABLE * TO my_new_user;

77
2017-08-30 14:11






答案:


我认为提及这一点可能会有所帮助,从9.0开始,postgres确实具有在模式中为所有表(以及其他对象)授予特权的语法:

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

这里的 链接


131
2018-06-26 14:00



我很快就会升级,所以这真是个好消息。谢谢! - Adam Matan
这是否会影响使用公共模式的服务器上的所有数据库? - kristianp
如果我创建一个新表,该用户是否可以访问新创建的表? - GuiSim
@GuiSim不,你必须设置 default privileges 在架构上,您可以在其中创建表: postgresql.org/docs/current/static/... - SkyRaT
@kristianp不,PG集群中的每个数据库都有自己的公共模式。它会影响架构中的所有表(函数) public 对于您连接的当前数据库。 - SkyRaT


我的(非单行)解决方案:

#!/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

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


11
2018-06-01 06:29



如果使用pg_stat_user_tables而不是all_tables,则不需要grep ...另外,将-A -t传递给psql以摆脱格式化输出。 - Magnus Hagander
请注意,从Postgres 9.0开始,这个答案的方法是艰难的。在9.x中,我们现在看到了“ON ALL” 这个答案。 - Basil Bourque


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

  1. 运行此查询:

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

    替换:

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

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


8
2017-08-05 13:25





这是我用过的:

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

我觉得在sql中进行格式化和where子句更自然。


2
2017-11-30 00:38





我正在使用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

1
2018-04-05 18:04



请用英文。 - Linger


解决此问题的一种方法是编写存储过程。遗憾的是,没有“授予所有表格的所有内容”命令。 你真的需要一个程序或一些外部shell脚本来使这项工作。


0
2017-07-03 18:20





我最终做了 这个,它工作:

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

0