选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

百科 / 错误代码 / Class 42 语法错误或访问规则冲突

42501 insufficient_privilege

权限不足

ERROR 已实测 详解 实测通过

条件名
insufficient_privilege
宏名称
ERRCODE_INSUFFICIENT_PRIVILEGE
启用版本
7.4
状态
活跃

版本覆盖

速览

SQLSTATE 42501 是 Class 42 中的 insufficient_privilege42501 表示权限不足。选定的自然路径让另一个角色在只有 schema USAGE、没有 sequence USAGE 时调用 runner 自有序列的 nextval,服务器报告 permission denied for sequence %s

含义

42501 表示权限不足。在选定路径中,nextval 进入 nextval_internal,先按有效的 GetUserId() 检查序列访问权限,再推进序列。schema 的 USAGE 只允许受限角色解析该 schema 中的对象,并不会授予本次调用所需的序列权限,因此服务器发出 ERROR 主报文 permission denied for sequence %s;其中序列名是动态值。

这里的 owner 边界很重要:owner 或管理员连接负责准备一次性 schema 和序列,另一个受限角色连接负责执行 nextval。实际修复是由 owner/管理员连接窄授 GRANT USAGE ON SEQUENCE ...,再让同一个受限角色重试;这不表示受限角色可以自行给自己授权。

同一 SQLSTATE 还覆盖其他权限边界。通用 ACL 检查器可以报告 permission denied for relation %spermission denied for schema %s 或列级形式;只允许 owner 的操作则使用 must be owner of relation %s 或相应对象类型。行级安全是执行器的另一层检查:表 ACL 通过时,INSERTUPDATE 的行仍可能违反策略并报 new row violates row-level security policy ...。这些是固定源码确认的 producer 分支,不是选定序列运行的额外观察。

诊断

检查 current_usersession_user、任何 SET ROLE、数据库、schema、准确关系或列,以及相应 ACL。把准备/授权连接与探测连接分开:将 runner_hostrunner_portrunner_dbrunner_user 替换为真实一次性目标和 owner/管理员凭据,再用另一个连接以生成的受限角色(例如 syntax_role)执行 nextval。否则连接池可能让 ACL 变更看起来作用到了另一个 backend。如果主报文点名关系、schema 或列,应检查该对象的权限,而不是假设都是 sequence USAGEmust be owner 要检查对象 owner 和生效角色;RLS 主报文则要检查适用于该角色的策略 USING/WITH CHECK。选定的自动提交探测得到 ERROR 后同一探测会话仍为 IDLE;显式事务则要先按自己的错误状态处理,再继续操作。它不同于 28000 的启动授权失败和 0A000 的功能不支持。

处理

由 owner/管理员连接只授予准确对象所需的权限(本例为 sequence USAGE),或使用应用设计所需的 owner/security-definer 或 RLS 策略。修改 ACL 后在同一个受限角色会话重试 nextval,并核对返回值和会话状态。超级用户确实会绕过 ACL,但不要把角色升为超级用户来替代有针对性的最小授权;schema USAGE、表权限和序列权限是不同检查。owner-only 失败应使用 owner/迁移角色,或有意识地变更 owner,而不是把 ACL 授权当成 owner 转移。如果涉及角色成员关系或 SET ROLE,还要检查实际生效角色。

可复现案例

在一次性实例上执行过的场景。其中 1 个附有可执行 SQL,正文相应小节里给出。

permission_denied_sequence PG 10 / 18 有 SQL

前置条件

  • A runner-owned disposable target is provisioned.
  • The runner can create a login role and grant schema/table privileges.

触发

Create a sequence, grant schema usage but no sequence privilege, then call nextval as a separate role.

断言

  • SQLSTATE is 42501 with sequence privilege diagnostic
  • The denied role session remains IDLE
  • Granting sequence USAGE permits nextval and returns the first value

处置

Grant only the required sequence privilege or change the owning role policy, then retry nextval on the same role session.

清理

Drop the case schema and temporary role with an owner connection.

报文

选定序列源码路径以 SQLSTATE 42501 发出明确的 ERROR,主报文为 permission denied for sequence %s%s 是解析出的序列关系名;该路径没有 DETAIL 或 HINT。其他固定 ACL 分支使用 permission denied for relation %spermission denied for schema %spermission denied for column "%s" of relation "%s";owner-only 检查使用 must be owner of relation %s 或相应对象类型。RLS WITH CHECK 分支使用 new row violates row-level security policy ... 主报文。只有客户端异常而没有针对具体分支的服务器 SQLSTATE 和主报文时,不能据此识别该 42501 producer。

报文模板

源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。

主消息 permission denied for sequence %s

来源:src/backend/commands/sequence.c @ REL_18_6 · src/backend/commands/sequence.c @ REL_10_23

主消息 permission denied for relation %s
主消息 permission denied for schema %s
主消息 permission denied for column "%s" of relation "%s"
主消息 must be owner of relation %s
主消息 must be owner of schema %s

来源:src/backend/catalog/aclchk.c @ REL_18_6 · src/backend/catalog/aclchk.c @ REL_10_23

适用范围:Generic ACL and owner-only source branches; no concrete runtime value is claimed.

主消息 new row violates row-level security policy "%s" for table "%s"
主消息 new row violates row-level security policy for table "%s"
主消息 new row violates row-level security policy "%s" (USING expression) for table "%s"
主消息 new row violates row-level security policy (USING expression) for table "%s"

来源:src/backend/executor/execMain.c @ REL_18_6 · src/backend/executor/execMain.c @ REL_10_23

适用范围:Fixed executor WITH CHECK branches; no concrete RLS runtime is claimed.

代表案例

本页使用与运行器注册表相同的语句。owner/管理员连接创建序列并授予 schema USAGE;受限角色连接执行两次 nextval 探测。执行时,syntax_schemasyntax_role 等生成名称会替换为一次性实例中的实际值,runner_hostrunner_portrunner_dbrunner_user 等连接占位符也必须替换为真实目标,不能照抄字面值。

CREATE SEQUENCE syntax_schema.syntax_sequence START WITH 1;
GRANT USAGE ON SCHEMA syntax_schema TO syntax_role;
SELECT nextval('syntax_schema.syntax_sequence');
GRANT USAGE ON SEQUENCE syntax_schema.syntax_sequence TO syntax_role;
SELECT nextval('syntax_schema.syntax_sequence');

选定的 18.6 运行记录结构化诊断并通过修复断言;10.21 运行通过同一案例的具体检查。可下载的案例和证据投影分别是 42501 案例 JSON作者证据。运行器清单为 verify/cases/42501/cases.json,页面 SQL 会与共享注册表核对。

版本

选定的自然运行范围是 PostgreSQL 18.6 与 10.21,不能据此推断所有中间版本的行为。

来源

证据

断言

每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。

运行记录

目标服务器版本结果覆盖案例
latest 18.6 (Homebrew) passed
pg10 10.21 (Debian 10.21-1.pgdg90+1) passed

同类错误代码

Class 42 语法错误或访问规则冲突 下的其他成员。