PostgreSQL给指定表授权报错:relation不存在的问题求助
解决PostgreSQL授予表只读权限失败的问题
你踩了PostgreSQL里一个非常常见的小坑——你当前连接的是postgres系统数据库,但你要授权的表mytable应该在mydb数据库里,从你执行select current_database();返回postgres就能明确这一点。下面一步步帮你修正操作:
1. 切换到目标数据库mydb
首先你需要进入表所在的数据库,在psql里可以用切换命令:
\c mydb
执行后会看到提示You are now connected to database "mydb" as user "postgres".,这时候你才处于正确的数据库环境中。
2. 确认表的存在性
切换到mydb后,执行\d命令查看当前库的所有表;或者直接指定schema查询目标表:
\d public.mytable
如果还是提示找不到关系,那你需要确认表到底存在于哪个数据库、哪个schema里——有可能你之前创建表的位置和你以为的不一样。
3. 执行正确的授权操作
确认表存在后,在mydb数据库里执行授权命令:
- 如果表在默认的
publicschema下:
GRANT SELECT ON TABLE public.mytable TO myuser;
- 如果表在自定义schema下(比如
myschema),要指定完整路径:
GRANT SELECT ON TABLE myschema.mytable TO myuser;
额外说明
你之前遇到的几个报错原因:
ERROR: relation "mytable" does not exist:你在postgres库找mytable,当然不存在ERROR: schema "mydb" does not exist:PostgreSQL里数据库和schema是层级关系,不能用数据库.表的写法,且跨数据库引用本身就不被支持ERROR: cross-database references are not implemented:PostgreSQL不允许直接跨数据库操作对象,必须切换到目标数据库才能操作里面的表、schema等
另外,postgres超级用户确实拥有所有权限,但权限是基于当前连接的数据库生效的,所以必须先切换到目标库再操作。
内容的提问来源于stack exchange,提问作者Sewake




