GRANT SELECT 到 postgresql 中的所有表

GRANT SELECT 到 postgresql 中的所有表

有没有一行代码可以授予SELECT 权限新用户postgresql?

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

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;

要授予将来创建的表的权限,请使用:

ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES 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

从特权用户运行,它就像魔法一样有效。

答案3

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

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

答案4

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

  1. 向所有人授予权限现存的表格:

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

    ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;
    
  3. 您还可以仔细检查所有表是否均被正确授予。

    • 统计所有现有表:

      SELECT COUNT(*)
      FROM pg_catalog.pg_tables
      WHERE schemaname != 'pg_catalog' AND
            schemaname != 'information_schema';
      
    • 统计用户可以访问的所有表:

      SELECT COUNT(*)
      FROM information_schema.role_table_grants
      WHERE grantee = 'user';
      

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

相关内容