Postgres执行select语句提示users表权限不足 授权后仍未解决
Postgres
permission denied for table users 报错排查及解决方案 以下是按优先级从高到低排列的排查点和对应解决方案:
- 确认授权操作的数据库是否和查询的数据库一致
Postgres的权限为数据库级隔离,你执行GRANT语句时如果连接的是默认postgres库而非实际业务库,授权不会生效。
解决步骤:- 切换到目标业务库
\c 你的实际业务库名- 重新执行授权语句
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO someuser; - 确认
users表所属的schema是否为public
建表时如果指定了自定义schema,针对publicschema的授权不会作用到其他schema的表上,同时用户需要schema的USAGE权限才能访问该schema下的对象。
解决步骤:- 查询表所属schema
SELECT table_schema FROM information_schema.tables WHERE table_name = 'users';- 针对返回的schema名称执行授权
-- 替换为实际的schema名 GRANT USAGE ON SCHEMA 你的schema名 TO someuser; GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA 你的schema名 TO someuser; - 确认
users表是否是授权语句执行后新建的ON ALL TABLES规则仅对执行授权时已经存在的表生效,后续新建的表不会自动继承已有授权。
解决步骤:
配置默认权限,让后续新建的表自动对应用户开放权限:-- 自定义schema请替换public为对应schema名 ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL PRIVILEGES ON TABLES TO someuser; - 确认pgAdmin当前登录的用户是授权的
someuser
执行查询时如果登录的是其他未授权的角色,也会触发权限报错。
解决步骤:
执行以下语句确认当前登录用户:
如果返回结果不是SELECT current_user;someuser,切换到授权用户后再执行查询即可。 - 确认
users表是否开启了行级安全策略(RLS)
开启RLS的表即使用户有表级读写权限,也会因为没有RLS对应权限触发访问拒绝。
解决步骤:- 检查是否开启RLS
SELECT relrowsecurity FROM pg_class WHERE relname = 'users';- 若返回结果为
t,说明RLS已开启,可根据需求选择配置对应RLS策略,或临时授予用户绕过RLS的权限(仅用于排查,不建议生产环境使用):
GRANT BYPASSRLS TO someuser;
内容的提问来源于stack exchange,提问作者Richi
相关产品推荐
相关产品推荐

