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

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

文档 / SQL 状态码 / 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

同类 SQL 状态码

状态码 条件名 宏名称 严重等级 版本
Class 42 语法错误或访问规则冲突 Syntax Error or Access Rule Violation 44 个
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
操作需要唯一排序规则,但无法确定。 活跃