百科 / SQL 状态码 / Class 55 对象未处于所需状态
55000 object_not_in_prerequisite_state
对象未处于前置状态
ERROR 已实测 详解 实测通过
- 条件名
object_not_in_prerequisite_state- 宏名称
ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE- 最早已知存在
- 7.4
- 状态
- 有效
手册收录:8.1、8.2、8.3、8.4、9.0、9.1、9.2、9.3、9.4、9.5、9.6、10、11、12、13、14、15、16、17、18、19、20。此处仅表示同版本手册收录,运行证据仍以原核验构建为准。
版本覆盖
版本条依据已采样构建显示;灰色版本可能尚未采样,悬停可查看。手册链接随版本选择,源码和运行证据保持原核验构建。
55000 — 对象未处于前置状态
速览 {#at-a-glance}
55000 表示请求的操作缺少某个必要的对象或服务器状态。本页选择 currval 所需的会话级序列前提;预加载、恢复和无效索引是不同机制。
含义 {#meaning}
currval 按后端会话记录状态。创建序列,或在另一个会话调用 nextval,都不会初始化当前会话。固定序列模板为 currval of sequence "%s" is not yet defined in this session,严重级别为 ERROR。
其他固定的 55000 路径有不同前提:pg_stat_statements 报 pg_stat_statements must be loaded via "shared_preload_libraries",应按正常配置流程加入启动参数并重启服务;pg_surgery 报 recovery is in progress,detail 为 Heap surgery functions cannot be executed during recovery.,应等待恢复完成,或在合适的可写 primary 上执行;pgstattuple 报 index "%s" is not valid,应先检查索引,并按适当的 REINDEX 或迁移流程重建后再调用。它们都是对象或服务器状态检查,不是权限错误,也不能与会话级序列案例互相替代。
诊断 {#diagnosis}
先确认对象状态以及对象所属的后端会话。对本路径,确认序列并检查这个 backend 是否调用过 nextval;连接池中另一个连接调用过也不满足当前会话前提。在显式事务中,失败的 currval 会使事务中止,因此修复前要执行 ROLLBACK 或 ROLLBACK TO SAVEPOINT。其他 55000 路径还要检查恢复状态、预加载设置、索引有效性或对象自身前提。
处理 {#response}
在同一 backend 先调用 nextval 再调用 currval;如果业务契约如此设计,也可以传入明确已知的值。自动提交时失败语句的事务已结束,可以重新发起下一条语句;显式事务中则先回滚或回滚到保存点,再调用 nextval。不要把它当作权限错误,也不要假设连接池中另一个连接的成功调用会初始化当前连接。
实测诊断 {#messages}
选定源码组为 ERROR,使用上述动态序列名模板。实测诊断中的序列名为 currval_sequence;错误后自动提交会话仍为 IDLE,同一会话随后通过 nextval 和 currval 返回 10。
代表案例 {#case}
选定注册表在一个自动提交 backend 上创建序列,然后在尚未调用 nextval 时调用 currval,再用 nextval(返回 10)初始化并再次读取 currval(返回 10)。失败调用、修复和验证属于同一会话状态转换;本案例不测试连接池切换。
CREATE SEQUENCE sequence_identifier START WITH 10;
SELECT currval('sequence_regclass');
SELECT nextval('sequence_regclass');
SELECT currval('sequence_regclass')
选定的 PostgreSQL 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态或断开恢复、修复、清理和一次性实例停止断言。详见 案例 JSON 与 作者证据。
版本 {#versions}
锁定目录从 7.4 起记录 55000。18.6 与 10.21 的序列会话案例均通过;这不覆盖其他 55000 分支,也不推断所有中间版本。
相关 {#related}
来源 {#sources}
src.errcodes.18.6—src/backend/utils/errcodes.txtat724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-2566e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba(source).src.currval.18.6—src/backend/commands/sequence.cat724edf9bde9d356724ad384a2e196edc3c9f80f7; blob SHA-2563e5afe17d5a84862fae502a5481211220368f1d639e9d07ba6f96ee8be92a8d8(source).src.currval.10.23—src/backend/commands/sequence.cat02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4; blob SHA-2565510e1266e8d8c548a4318d753392e92e689d348f3353a2aa53d8dea871c44ab(source).src.path.0—contrib/pg_stat_statements/pg_stat_statements.cat724edf9bde9d356724ad384a2e196edc3c9f80f7的shared_preload_libraries检查(来源)。src.path.1—contrib/pg_surgery/heap_surgery.cat724edf9bde9d356724ad384a2e196edc3c9f80f7的恢复状态检查与 detail(来源)。src.path.2—contrib/pgstattuple/pgstatindex.cat724edf9bde9d356724ad384a2e196edc3c9f80f7的无效索引检查(来源)。src.calls.REL_18_6/src.calls.REL_10_23— fixed call scans, SHA-2569ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf/00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c.manifest.55000/snippet-registry.55000— hashes are recorded inevidence/55000.jsonand each selected runtime record.
来源
- 上游源码 src/backend/commands/sequence.c 第 845–848 行
- 上游源码 src/backend/commands/sequence.c 第 884–887 行
- 上游源码 src/backend/utils/errcodes.txt 第 424 行
- 上游源码 contrib/pg_stat_statements/pg_stat_statements.c 第 1685 行
- 上游源码 contrib/pg_surgery/heap_surgery.c 第 99 行
- 上游源码 contrib/pgstattuple/pgstatindex.c 第 244 行
- 核验材料 verify/cases/55000/cases.json
- 核验材料 verify/cases/55000/snippets.json
- 核验材料 raw/calls/REL_10_23.jsonl
- 核验材料 raw/calls/REL_18_6.jsonl
证据
断言
每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。
-
55000 is object_not_in_prerequisite_state in SQLSTATE Class 55.
-
The cited PostgreSQL 18.6 source paths support the representative resource and object-state mechanisms described.
-
The locked catalogue records 55000 from 7.4; that boundary does not prove exact implementation introduction.
-
The sequence currval path requires a prior nextval call in the same backend session and reports 55000 before that prerequisite exists; creating the sequence does not initialize the session-local last-value state.
-
The currval_before_nextval case passed on isolated PostgreSQL 18.6 and 10.21 targets; nextval initialized currval on the same session and returned 10.
运行记录
| 目标 | 服务器版本 | 结果 | 覆盖案例 |
|---|---|---|---|
| latest | 18.6 (Homebrew) | passed | 案例:currval_before_nextval |
| pg10 | 10.21 (Debian 10.21-1.pgdg90+1) | passed | 案例:currval_before_nextval |
报文模板
源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。
pg_stat_statements must be loaded via "shared_preload_libraries"
来源: 来源:contrib/pg_stat_statements/pg_stat_statements.c @ REL_18_6
recovery is in progress
Heap surgery functions cannot be executed during recovery.
index "%s" is not valid
currval of sequence "%s" is not yet defined in this session
currval of sequence "%s" is not yet defined in this session
可复现案例
在一次性实例上执行过的场景。其中 1 个附有可执行 SQL,正文相应小节里给出。
currval_before_nextval PG 10 / 18 有 SQL
前置条件
- A runner-owned sequence exists.
- The trigger and repair use one backend session.
触发
Call currval for a sequence before this backend has called nextval, then initialize and read it.
断言
- SQLSTATE is 55000 with ERROR severity
- The diagnostic says currval is not yet defined in this session
- The failed autocommit session remains IDLE
- nextval initializes currval on the same backend and both values are 10
处置
Use nextval in the same session before currval, or pass an explicitly known value; creating the sequence in another session does not initialize this session’s currval state.
清理
Close all runner connections and drop the case schema with an owner connection.
同类 SQL 状态码
| 状态码 | 条件名 | 宏名称 | 严重等级 | 版本 |
|---|---|---|---|---|
| 55000 | object_not_in_prerequisite_state | ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE |
ERROR | 7.4 起已知 |
| 对象或服务器未处于操作所需的前置状态。 | 有效 | |||
| 55006 | object_in_use | ERRCODE_OBJECT_IN_USE |
ERROR | 7.4 起已知 |
| 对象正被使用,操作与进行中的占用冲突。 | 有效 | |||
| 55P02 | cant_change_runtime_param | ERRCODE_CANT_CHANGE_RUNTIME_PARAM |
ERROR | 7.4 起已知 |
| 当前上下文或阶段不允许修改该运行时参数。 | 有效 | |||
| 55P03 | lock_not_available | ERRCODE_LOCK_NOT_AVAILABLE |
ERROR | 8.0.0 起已知 |
| 当前等待策略下取不到锁,含 lock_timeout 到期。 | 有效 | |||
| 55P04 | unsafe_new_enum_value_usage | ERRCODE_UNSAFE_NEW_ENUM_VALUE_USAGE |
ERROR | 12.0 起已知 |
| 同一事务中使用了尚未提交的新增 enum 值。 | 有效 | |||