it-swarm.cn

GRANT SELECT到PostgreSQL中的所有表

是否存在将 SELECT权限 授予 新用户 postgresql的单行代码?

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

GRANT SELECT ON TABLE * TO my_new_user;
94
Adam Matan

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

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

这是 链接

153
TimH

我的(单线)解决方案:

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

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

12
Adam Matan

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

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

9
Ben Williams

我最终做了 this ,它起作用了:

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

这是我使用的:

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

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

2
stox

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

当存在许多架构时,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
0
anneb

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

0
postgresql007