文档 / SQL 状态码 / Class 42 语法错误或访问规则冲突
42501 insufficient_privilege
权限不足
ERROR 已实测 详解 实测通过
- 条件名
insufficient_privilege- 宏名称
ERRCODE_INSUFFICIENT_PRIVILEGE- 启用版本
- 7.4
- 状态
- 活跃
版本覆盖
速览
SQLSTATE 42501 是 Class 42 中的 insufficient_privilege。42501 表示权限不足。选定的自然路径让另一个角色在只有 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 %s、permission denied for schema %s 或列级形式;只允许 owner 的操作则使用 must be owner of relation %s 或相应对象类型。行级安全是执行器的另一层检查:表 ACL 通过时,INSERT 或 UPDATE 的行仍可能违反策略并报 new row violates row-level security policy ...。这些是固定源码确认的 producer 分支,不是选定序列运行的额外观察。
诊断
检查 current_user、session_user、任何 SET ROLE、数据库、schema、准确关系或列,以及相应 ACL。把准备/授权连接与探测连接分开:将 runner_host、runner_port、runner_db、runner_user 替换为真实一次性目标和 owner/管理员凭据,再用另一个连接以生成的受限角色(例如 syntax_role)执行 nextval。否则连接池可能让 ACL 变更看起来作用到了另一个 backend。如果主报文点名关系、schema 或列,应检查该对象的权限,而不是假设都是 sequence USAGE;must 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 %s、permission denied for schema %s 和 permission 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_schema、syntax_role 等生成名称会替换为一次性实例中的实际值,runner_host、runner_port、runner_db、runner_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,不能据此推断所有中间版本的行为。
来源
- 上游源码 src/backend/catalog/aclchk.c 第 3301–3449 行
- 上游源码 src/backend/catalog/aclchk.c 第 2793–2795 行
- 上游源码 src/backend/utils/errcodes.txt
- 上游源码 src/backend/executor/execMain.c 第 2188–2208 行
- 上游源码 src/backend/executor/execMain.c 第 2332–2365 行
- 上游源码 src/backend/commands/sequence.c 第 605–608 行
- 上游源码 src/backend/commands/sequence.c 第 652–655 行
- 核验材料 verify/cases/42501/cases.json
- 核验材料 verify/cases/42501/snippets.json
- 核验材料 raw/calls/REL_10_23.jsonl
- 核验材料 raw/calls/REL_18_6.jsonl
证据
断言
每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。
-
42501 is the insufficient_privilege condition in Class 42.
-
The fixed source calls for 42501 include the mechanism and message boundary selected for this page.
-
Fixed 42501 branches also cover relation/schema/column ACL failures, owner-only checks, and row-level security WITH CHECK failures with different primaries.
-
The selected permission_denied_sequence case passed on isolated PostgreSQL 18.6 and 10.21 targets.
-
The locked catalogue records 42501; runtime scope is limited to the selected targets.
运行记录
| 目标 | 服务器版本 | 结果 | 覆盖案例 |
|---|---|---|---|
| latest | 18.6 (Homebrew) | passed | |
| pg10 | 10.21 (Debian 10.21-1.pgdg90+1) | passed |
同类 SQL 状态码
| 状态码 | 条件名 | 宏名称 | 严重等级 | 版本 |
|---|---|---|---|---|
| 42000 | syntax_error_or_access_rule_violation | ERRCODE_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION |
ERROR | 7.4 |
| 语法错误或访问规则违反的总类,见具体子码。 | 活跃 | |||
| 42501 | insufficient_privilege | ERRCODE_INSUFFICIENT_PRIVILEGE |
ERROR | 7.4 |
| 当前角色对目标对象的权限不足。 | 活跃 | |||
| 42601 | syntax_error | ERRCODE_SYNTAX_ERROR |
ERROR | 7.4 |
| SQL 语句存在语法错误,解析器拒绝执行。 | 活跃 | |||
| 42602 | invalid_name | ERRCODE_INVALID_NAME |
ERROR | 7.4 |
| 名称不合法,如 enum 标签超出长度限制。 | 活跃 | |||
| 42611 | invalid_column_definition | ERRCODE_INVALID_COLUMN_DEFINITION |
ERROR | 7.4 |
| 列定义无效,如继承的父表默认值冲突。 | 活跃 | |||
| 42622 | name_too_long | ERRCODE_NAME_TOO_LONG |
ERROR | 7.4 |
| 标识符或 name 值超出长度上限。 | 活跃 | |||
| 42701 | duplicate_column | ERRCODE_DUPLICATE_COLUMN |
ERROR | 7.4 |
| 同一定义中重复指定了同名列。 | 活跃 | |||
| 42702 | ambiguous_column | ERRCODE_AMBIGUOUS_COLUMN |
ERROR | 7.4 |
| 列引用有歧义,多个表都有该列名。 | 活跃 | |||
| 42703 | undefined_column | ERRCODE_UNDEFINED_COLUMN |
ERROR | 7.4 |
| 引用的列在目标关系中不存在。 | 活跃 | |||
| 42704 | undefined_object | ERRCODE_UNDEFINED_OBJECT |
ERROR | 7.4 |
| 引用的数据库对象不存在,如触发器或类型。 | 活跃 | |||
| 42710 | duplicate_object | ERRCODE_DUPLICATE_OBJECT |
ERROR | 7.4 |
| 要定义的对象名已被占用,如重复 CREATE TYPE。 | 活跃 | |||
| 42712 | duplicate_alias | ERRCODE_DUPLICATE_ALIAS |
ERROR | 7.4 |
| 同一查询命名空间中重复使用了表别名。 | 活跃 | |||
| 42723 | duplicate_function | ERRCODE_DUPLICATE_FUNCTION |
ERROR | 7.4 |
| 同一模式下已存在同名同参数类型的函数。 | 活跃 | |||
| 42725 | ambiguous_function | ERRCODE_AMBIGUOUS_FUNCTION |
ERROR | 7.4 |
| 函数调用有多个候选,无法选出最佳匹配。 | 活跃 | |||
| 42803 | grouping_error | ERRCODE_GROUPING_ERROR |
ERROR | 7.4 |
| 分组查询输出了既未分组也未聚合的列。 | 活跃 | |||
| 42804 | datatype_mismatch | ERRCODE_DATATYPE_MISMATCH |
ERROR | 7.4 |
| 表达式类型与目标上下文要求的类型不符。 | 活跃 | |||
| 42809 | wrong_object_type | ERRCODE_WRONG_OBJECT_TYPE |
ERROR | 7.4 |
| 命令本身有效,但不能作用于该类对象。 | 活跃 | |||
| 42830 | invalid_foreign_key | ERRCODE_INVALID_FOREIGN_KEY |
ERROR | 7.4 |
| 外键在被引用列上找不到合格的唯一键。 | 活跃 | |||
| 42846 | cannot_coerce | ERRCODE_CANNOT_COERCE |
ERROR | 7.4 |
| 源类型到目标类型之间没有可用的 cast。 | 活跃 | |||
| 42883 | undefined_function | ERRCODE_UNDEFINED_FUNCTION |
ERROR | 7.4 |
| 按名称和参数类型找不到匹配的函数或操作符。 | 活跃 | |||
| 428C9 | generated_always | ERRCODE_GENERATED_ALWAYS |
ERROR | 10 |
| 向身份列或生成列赋值,这类列只接受 DEFAULT。 | 活跃 | |||
| 42939 | reserved_name | ERRCODE_RESERVED_NAME |
ERROR | 7.4 |
| 对象名使用了保留名称,如模式或表空间。 | 活跃 | |||
| 42P01 | undefined_table | ERRCODE_UNDEFINED_TABLE |
ERROR | 7.4 |
| 引用的表、视图或其他关系不存在。 | 活跃 | |||
| 42P02 | undefined_parameter | ERRCODE_UNDEFINED_PARAMETER |
ERROR | 7.4 |
| 查询引用了解析器未知的位置参数,如 $1。 | 活跃 | |||
| 42P03 | duplicate_cursor | ERRCODE_DUPLICATE_CURSOR |
ERROR | 7.4 |
| 游标或 portal 名称与已有的冲突。 | 活跃 | |||
| 42P04 | duplicate_database | ERRCODE_DUPLICATE_DATABASE |
ERROR | 7.4 |
| 集群中已存在同名数据库。 | 活跃 | |||
| 42P05 | duplicate_prepared_statement | ERRCODE_DUPLICATE_PSTATEMENT |
ERROR | 7.4 |
| 当前会话已有同名的服务端预备语句。 | 活跃 | |||
| 42P06 | duplicate_schema | ERRCODE_DUPLICATE_SCHEMA |
ERROR | 7.4 |
| 要创建的模式名在当前数据库中已存在。 | 活跃 | |||
| 42P07 | duplicate_table | ERRCODE_DUPLICATE_TABLE |
ERROR | 7.4 |
| 关系名已存在,或继承父项重复。 | 活跃 | |||
| 42P08 | ambiguous_parameter | ERRCODE_AMBIGUOUS_PARAMETER |
ERROR | 7.4 |
| 参数存在但无法推导出一致而具体的类型。 | 活跃 | |||
| 42P09 | ambiguous_alias | ERRCODE_AMBIGUOUS_ALIAS |
ERROR | 7.4 |
| 一个表引用对应多个关系命名空间项。 | 活跃 | |||
| 42P10 | invalid_column_reference | ERRCODE_INVALID_COLUMN_REFERENCE |
ERROR | 7.4 |
| 列引用不符合该操作的契约,如 COPY 生成列。 | 活跃 | |||
| 42P11 | invalid_cursor_definition | ERRCODE_INVALID_CURSOR_DEFINITION |
ERROR | 7.4 |
| 游标声明违反定义阶段规则,如 SCROLL 选项冲突。 | 活跃 | |||
| 42P12 | invalid_database_definition | ERRCODE_INVALID_DATABASE_DEFINITION |
ERROR | 7.4 |
| 数据库定义无效,核心源码中未见触发路径。 | 活跃 | |||
| 42P13 | invalid_function_definition | ERRCODE_INVALID_FUNCTION_DEFINITION |
ERROR | 7.4 |
| 函数、聚合或触发器声明在校验阶段失败。 | 活跃 | |||
| 42P14 | invalid_prepared_statement_definition | ERRCODE_INVALID_PSTATEMENT_DEFINITION |
ERROR | 7.4 |
| PREPARE 定义预备语句时失败。 | 活跃 | |||
| 42P15 | invalid_schema_definition | ERRCODE_INVALID_SCHEMA_DEFINITION |
ERROR | 7.4 |
| CREATE SCHEMA 的模式声明不一致被拒绝。 | 活跃 | |||
| 42P16 | invalid_table_definition | ERRCODE_INVALID_TABLE_DEFINITION |
ERROR | 7.4 |
| 表定义无效,如分区键或主键规则冲突。 | 活跃 | |||
| 42P17 | invalid_object_definition | ERRCODE_INVALID_OBJECT_DEFINITION |
ERROR | 7.4 |
| 对象定义无效,如继承、生成列或规则冲突。 | 活跃 | |||
| 42P18 | indeterminate_datatype | ERRCODE_INDETERMINATE_DATATYPE |
ERROR | 7.4 |
| 无法推断表达式或参数的数据类型。 | 活跃 | |||
| 42P19 | invalid_recursion | ERRCODE_INVALID_RECURSION |
ERROR | 8.4 |
| 递归查询结构不合法,执行前被检查拒绝。 | 活跃 | |||
| 42P20 | windowing_error | ERRCODE_WINDOWING_ERROR |
ERROR | 8.4 |
| 窗口函数调用或框架边界定义不合法。 | 活跃 | |||
| 42P21 | collation_mismatch | ERRCODE_COLLATION_MISMATCH |
ERROR | 9.1 |
| 参与运算的排序规则不兼容,产生冲突。 | 活跃 | |||
| 42P22 | indeterminate_collation | ERRCODE_INDETERMINATE_COLLATION |
ERROR | 9.1 |
| 操作需要唯一排序规则,但无法确定。 | 活跃 | |||