对 postgresql 中的所有表进行 GRANT SELECT

Ada*_*tan 122 postgresql permissions sql user-management

是否有一个班轮,授予SELECT权限新用户的PostgreSQL?

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

GRANT SELECT ON TABLE * TO my_new_user;
Run Code Online (Sandbox Code Playgroud)

小智 205

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

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO user;
Run Code Online (Sandbox Code Playgroud)

这是链接

  • @GuiSim 不,您必须在架构上设置“默认权限”,您可以在其中创建表:http://www.postgresql.org/docs/current/static/sql-alterdefaultprivileges.html (11认同)
  • 如果我创建一个新表,该用户是否可以访问新创建的表? (10认同)

Ada*_*tan 14

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

#!/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
Run Code Online (Sandbox Code Playgroud)

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

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

Ben*_*ams 12

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

  1. 运行此查询:

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

    更换:

    $foo= 您要授予权限的用户名
    $bar$baz= 您要授予权限的架构(可以只是“公开”)

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


小智 8

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

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO PUBLIC;
Run Code Online (Sandbox Code Playgroud)


Cra*_*raZ 6

我最终来到这里是因为我的数据库用户只看到了几个表,而不是较新的表。如果这是你的情况,这对我有帮助。

  1. 向所有现有表授予权限:

    GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 向将来要创建的所有新表授予权限(通过默认权限):

    ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您还可以仔细检查所有表是否都已正确授予。

    最后两个查询的计数必须相同。