GRANT SELECT到PostgreSQL中的所有表


Answers:


144

我认为,提到9.0起,postgres确实具有在模式中授予所有表(以及其他对象)特权的语法:

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

这是链接


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

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

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

8
@GuiSim不,您必须default privileges在架构上设置ytou创建表:postgresql.org/docs/current/static/…–
SkyRaT

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

11

我的(单线)解决方案:

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

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


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

1
请注意,从Postgres 9.0开始,此答案的方法很难做到。在9.x中,我们现在在另一个答案中看到了“全部” 。
罗勒·布尔克

在表或模式名称包含大写字母的情况下,此方法不起作用。在下方添加修改后的版本
退火

9

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

  1. 运行此查询:

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

    更换:

    $foo=您要为其授予权限的用户名
    $bar$baz=您要在其中授予权限的架构(可以只是“ public”)

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


2

这是我使用的:

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

我觉得在sql中进行格式设置和子句比较自然。


2

我最终这样做,它奏效了:

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

1

我正在使用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
请用英文。
2012年

0

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


0

当存在许多模式时,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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.