PostgreSQL模式所有者无法在自身模式创建表的问题及解决
问题分析与解决办法
为什么模式所有者无法创建表?
PostgreSQL中,模式所有者默认拥有该模式的所有权限(包括CREATE、USAGE等),但出现权限拒绝通常有以下几种可能:
- 权限被显式撤销:可能有人手动执行了撤销权限的语句,即使是模式所有者也会丢失创建对象的权限。
- 角色身份不符:应用连接数据库时使用的角色并非
atlasuser,或者atlasuser作为子角色,操作时继承的父角色没有该模式的创建权限。 - 模式所有者配置错误:可能实际模式的所有者并非
atlasuser,需要查询确认。
修正步骤
1. 确认模式实际所有者
使用超级用户或数据库所有者登录,执行以下查询确认模式归属:
SELECT schemaname, owner FROM pg_namespace WHERE schemaname = 'tmp_atlas_mdcr2003_2021';
如果结果显示所有者不是atlasuser,执行语句重新设置:
ALTER SCHEMA tmp_atlas_mdcr2003_2021 OWNER TO atlasuser;
2. 恢复模式的CREATE与USAGE权限
若所有者正确但权限被撤销,执行以下语句授予权限(需超级用户或数据库所有者操作):
GRANT CREATE, USAGE ON SCHEMA tmp_atlas_mdcr2003_2021 TO atlasuser;
3. 确认当前操作角色
在应用连接数据库后,执行语句确认当前使用的角色:
SELECT current_user;
确保返回结果为atlasuser,避免因角色切换导致权限不足。
4. 检查角色继承设置
如果atlasuser是其他角色的成员,确认其继承权限是否开启:
SELECT rolname, rolinherit FROM pg_roles WHERE rolname = 'atlasuser';
若rolinherit为false,执行语句开启继承:
ALTER ROLE atlasuser INHERIT;
内容的提问来源于stack exchange,提问作者Jose Cabrera Zuniga
相关产品推荐
相关产品推荐

