#!/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
#!/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
#!/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
我认为从 9.0 开始,postgres 确实具有授予模式中所有表(以及其他对象)权限的语法,这可能会有所帮助:
这是链接。
我的(非单线)解决方案:
从特权用户运行,它就像一个魅力。
这可以通过两步过程来完成。
运行此查询:
替代品:
$foo
=您要授予权限的用户名$bar
,$baz
=您要授予权限的模式(可以只是“公共”)这将为您提供将生成所需权限的查询列表。复制输出,将其粘贴到另一个查询中,然后执行。
我最终这样做了,它奏效了:
我最终来到这里是因为我的数据库用户只看到了几张表而不是较新的表。如果这是你的情况,这对我有帮助。
授予所有现有表的权限:
为将来要创建的所有新表授予权限(通过默认权限):
您还可以仔细检查是否正确授予了所有表。
计算所有现有表:
计算用户有权访问的所有表:
最后两个查询的计数必须相同。
这是我使用的:
我觉得在sql中进行格式化和where子句更自然..
我正在使用 postgres 8.4 并为用户提供所有权限,请执行以下操作:
解决此问题的一种方法是编写存储过程。不幸的是,没有“将所有内容授予所有表”命令左右。你真的需要一个程序或一些外部 shell 脚本来完成这项工作。
当有许多模式时,Adam Matan 的(单线解决方案)脚本很棒,但在模式名称或表名称包含大写字母或特殊字符的情况下它不起作用。
修改版: