答案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
这可以通过两步过程完成。
运行此查询:
select 'grant all on '||schemaname||'.'||tablename||' to $foo;' from pg_tables where schemaname in ('$bar', '$baz') order by schemaname, tablename;
替换:
$foo
= 您想要授予权限的用户名
$bar
,$baz
= 您想要授予权限的架构(可以是“公共”)这将为您提供生成所需权限的查询列表。复制输出,将其粘贴到另一个查询中,然后执行。
答案4
我最终来到这里是因为我的数据库用户只看到了几个表,而不是较新的表。如果你的情况如此,那么这对我很有帮助。
向所有人授予权限现存的表格:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
向所有人授予权限新的将来要创建的表(通过默认权限):
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;
您还可以仔细检查所有表是否均被正确授予。
统计所有现有表:
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';
最后两个查询的数量必须相同。