PostgreSQL · 错误码速查
PostgreSQL permission denied for table:当前角色缺这张表的权限,先查是哪种权限、是不是新表
ERROR: permission denied for table orders(SQLSTATE 42501)表示当前角色没有这条语句需要的表权限(SELECT / INSERT / UPDATE / DELETE / TRUNCATE…)。最常见的三个原因:从没授权;`GRANT … ON ALL TABLES` 只覆盖执行当时已有的表,之后新建的表需要 ALTER DEFAULT PRIVILEGES;只授了部分列却 SELECT *。INSERT 成功越过表权限后,serial/identity 列还可能报 permission denied for sequence。PostgreSQL 10 及以前同一错误的原文是 permission denied for relation。
官方原文
permission denied for table %s出自 PostgreSQL 源码 src/backend/catalog/aclchk.c 的 aclcheck_error()(REL_17_STABLE),同一函数还给出 permission denied for sequence / schema 等;错误码 42501 在官方附录 A 中为 insufficient_privilege。REL_10_STABLE 中对应原文为 permission denied for relation %s。
出处:PostgreSQL 源码 REL_17_STABLE:src/backend/catalog/aclchk.c(aclcheck_error) 最后核对:
| SQLSTATE | 42501(insufficient_privilege,Class 42) | 出处 |
|---|---|---|
| 旧版本原文 | PG10 及以前:permission denied for relation %s(源码,未在测试库复现) | 出处 |
| GRANT ON ALL TABLES | 只作用于执行时已存在的表;之后新建的表靠 ALTER DEFAULT PRIVILEGES | 出处 |
| PG15 起 public schema | 取消 PUBLIC 在 public schema 的 CREATE 权限(新集群与新建库) | 出处 |
| 最后核对 | 2026-11-11 |
盈尺实测(测试库,非官方文档):2026-11-11 PostgreSQL 17.11 测试库(自造 orders 表,角色 report / app),6 种 42501 场景与修复后的对照结果。 本页第一段:测试库复现输出 →
6 种场景的报错原文(PostgreSQL 17.11 测试库实测)
2026-11-11 在 box 本机测试库(PostgreSQL 17.11 新建实例,lc_messages=C,表和角色全部自造,非客户环境),用超级用户建表 orders(id serial, amount, phone),再用普通角色 report / app 执行:
| 场景 | 报错原文 | 修好的那一步 |
|---|---|---|
| report 没任何授权就 SELECT / INSERT;app 无权 TRUNCATE | permission denied for table orders | GRANT SELECT ON orders TO report |
| app 有 INSERT 权限,但 id 是 serial | permission denied for sequence orders_id_seq | GRANT USAGE ON SEQUENCE orders_id_seq TO app |
| 先 GRANT SELECT ON ALL TABLES IN SCHEMA public,之后新建 refunds | permission denied for table refunds | ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO report(只对之后新建的表) |
| 只授权 (id, amount) 两列,SELECT * | permission denied for table orders | 只查授权的列 |
| 普通角色在 public 建表 | permission denied for schema public | CREATE SCHEMA app_s AUTHORIZATION app |
| report 访问没有 USAGE 的 schema | permission denied for schema app_s | GRANT USAGE ON SCHEMA app_s TO report |
注意第三行:ALTER DEFAULT PRIVILEGES 只对执行它的角色之后建的表生效。测试库里是 postgres 执行、postgres 建表;如果你的表由迁移账号建,要加 FOR ROLE 迁移账号(这一点未在测试库验证,以官方文档为准)。
列级授权:SELECT * 报的是 table,不是 column
给报表账号做脱敏时常见做法是只授部分列(GRANT SELECT (id, amount) ON orders TO report)。测试库里 SELECT * 报的仍是 permission denied for table orders,容易让人以为授权没生效;SELECT id, amount 正常返回。BI 工具预览表时默认 SELECT *,所以「能连上、一打开表就报错」很常见。
SELECT has_table_privilege('report', 'orders', 'SELECT') AS t,
has_column_privilege('report', 'orders', 'phone', 'SELECT') AS phone,
has_schema_privilege('app', 'public', 'CREATE') AS pub_create;升级到 PG15+ 后应用不能建表:public schema 默认收回了 CREATE
PostgreSQL 15 发布说明:Remove PUBLIC creation permission on the public schema,适用于新集群和新建的库。测试库 PG17 普通角色在 public 建表报 permission denied for schema public(不是 for table)。迁移/建表账号不要靠 public 的默认权限:建专用 schema 并 AUTHORIZATION 给它,或者显式 GRANT CREATE ON SCHEMA public TO 角色,再把 search_path 设好。(PG15 Release Notes、Privileges)
直接读 ACL:relacl 里看谁有什么
SELECT relname, relacl
FROM pg_class
WHERE relname IN ('orders', 'refunds', 'refunds2');测试库输出:orders {postgres=arwdDxtm/postgres,app=ar/postgres}、refunds 为空(只有属主有权限)、refunds2 {…,report=r/postgres}。字母含义:r=SELECT、a=INSERT、w=UPDATE、d=DELETE、D=TRUNCATE、x=REFERENCES、t=TRIGGER、m=MAINTAIN(PG17 新增)。refunds 为空正是 GRANT ON ALL TABLES 之后新建、没有默认权限的那张表。
常见问题
permission denied for table 是什么意思?
SQLSTATE 42501(insufficient_privilege):当前角色对这张表缺少这条语句需要的权限,例如 SELECT、INSERT、TRUNCATE。用 has_table_privilege 或 \dp 查实际权限。
已经 GRANT ON ALL TABLES 了,新表为什么还报?
GRANT ON ALL TABLES 只覆盖执行时已存在的表。之后新建的表要用 ALTER DEFAULT PRIVILEGES 预先授权,而且它只对执行该命令的角色(或 FOR ROLE 指定的角色)之后建的表生效。
有 INSERT 权限为什么报 permission denied for sequence?
serial 列取默认值要调用 nextval,需要序列的 USAGE 权限。GRANT USAGE ON SEQUENCE 表名_列名_seq TO 角色 后测试库插入成功。
permission denied for relation 和 for table 有区别吗?
同一个错误。PostgreSQL 10 及以前源码原文是 for relation,11 起按对象类型写 for table、for sequence 等。
PG15 以后普通用户在 public 建表报错怎么办?
PG15 起 public schema 默认不再允许 PUBLIC 建表。给应用建专用 schema 并授权,或显式 GRANT CREATE ON SCHEMA public。
免费 · 留邮箱领检查单
PostgreSQL 14 停更升级检查单(Excel 可直接打开)
- PG14 2026-11-12 停更,升 17 / 18 前后 19 项检查:只读预检、--check、回滚、补统计、回归
- 每项写清怎么查、通过标准、不处理会怎样(附测试库实测数字)
- 配合站上的只读预检 SQL 使用,每个业务库各跑一次
下一步
价格以对应页面当前标价为准。
出处(最后核对 2026-11-11)
- PostgreSQL 源码 REL_17_STABLE:src/backend/catalog/aclchk.c(aclcheck_error)
- PostgreSQL 源码 REL_10_STABLE:src/backend/catalog/aclchk.c(permission denied for relation)
- PostgreSQL 17 文档:Appendix A. PostgreSQL Error Codes
- PostgreSQL 17 文档:5.8 Privileges
- PostgreSQL 17 文档:ALTER DEFAULT PRIVILEGES
- PostgreSQL 15 Release Notes(Remove PUBLIC creation permission on the public schema)
本页摘录并解读上面列出的官方文档,不是官方页面;官方文档更新后以官方为准。除标明「盈尺实测」的一段外,其余内容都来自官方文档。