PostgreSQL 9.6数据库Relation权限拒绝问题求助
排查PostgreSQL 9.6权限问题:解决创建对象和查询时的Permission Denied错误
我来帮你一步步拆解这个权限问题,搞定它:
核心问题分析
你遇到的报错本质是操作权限的执行者不对,加上现有表未被授予权限,具体来说:
- 你尝试用
foo账号执行GRANT命令——这根本行不通,因为foo不是表的所有者(大概率是postgres超级用户),没有权限给自己或其他用户分配表权限。 - 导入DDL后创建的表,默认不会给
foo开放权限,哪怕你设置了schema的默认权限——默认权限只对设置之后创建的对象生效,之前导入的表需要单独授权。 \z看到无权限配置,说明这些表的所有者完全没给foo分配任何权限,自然所有操作都会被拒绝。
分步解决方法
1. 切换到超级用户执行授权操作
在Docker环境下,先进入容器的超级用户会话(默认超级用户是postgres):
docker exec -it <你的PostgreSQL容器名> psql -U postgres <你的数据库名>
替换<你的PostgreSQL容器名>和<你的数据库名>为实际名称,比如docker exec -it postgres_db psql -U postgres my_db。
2. 给现有表/序列/函数授权
先给public schema下所有已存在的对象分配权限给foo:
-- 给所有表授权 GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO foo; -- 如果有自增序列,必须单独授权(否则插入数据会报错) GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO foo; -- 如果有自定义函数,也需要授权 GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public TO foo;
执行这些命令时不会再报错,因为你是用超级用户操作的。
3. 设置未来对象的默认权限
为了避免之后新创建的表/视图再出现权限问题,设置public schema的默认权限,让未来创建的对象自动给foo开放权限:
-- 未来创建的表默认给foo权限 ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON TABLES TO foo; -- 未来创建的序列默认权限 ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON SEQUENCES TO foo; -- 未来创建的函数默认权限 ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON FUNCTIONS TO foo;
注意:这条规则只对执行该命令的用户创建的对象生效,如果之后是其他用户创建对象,需要对应执行ALTER DEFAULT PRIVILEGES。
4. 确认Schema访问权限
确保foo能访问public schema(如果之前没设置的话):
GRANT USAGE ON SCHEMA public TO foo;
验证解决效果
退出超级用户会话,用foo账号重新登录数据库:
docker exec -it <你的PostgreSQL容器名> psql -U foo <你的数据库名>
执行以下操作验证:
- 执行
\z,应该能看到foo对所有表有对应的权限标记(比如r代表读,w代表写等) - 尝试执行
SELECT * FROM table_1;或者创建物化视图,应该不再出现权限错误。
补充说明
你之前遇到的table_1/table_2报错并不是误导,只是因为这些表都没有给foo授权,报错会优先抛出第一个遇到的无权限表而已,和表之间的关联无关。
内容的提问来源于stack exchange,提问作者Homunculus Reticulli
相关产品推荐
相关产品推荐

