# 55006 — 对象正在使用

> PostgreSQL SQLSTATE 55006（对象正在使用，object_in_use）的源码证据、诊断与处理参考。
---

# 55006 — 对象正在使用

## 速览 {#at-a-glance}

`55006` 表示请求的对象操作与正在进行的使用冲突。本页选择显式事务中同一会话的活动 cursor 占用表；数据库用户、逻辑复制和待处理触发器事件是不同路径。

<!-- BEGIN SQLSTATE FACTS: generated by scripts/generate.py; do not edit -->

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `55006` |
| 条件名 | `object_in_use` |
| 状态 | `有效` |
| 已知存在于 | `7.4` |
| 锁定快照 | `9.0.23, 9.1.24, 9.2.24, 9.3.25, 9.4.26, 9.5.25, 9.6.24, 10.23, 11.22, 12.22, 13.23, 14.24, 15.19, 16.15, 17.11, 18.6, 19beta3` |
| 宏 | `ERRCODE_OBJECT_IN_USE` |
| 别名 | `—` |

<!-- source facts: data/errcodes/55006.json -->
<!-- END SQLSTATE FACTS -->

## 含义 {#meaning}

选定的表命令模板为 `cannot %s "%s" because it is being used by active queries in this session`。关系引用计数指向同一 backend 的活动 portal 或扫描，不是一般权限问题。同一个表使用检查还有当前事务排队的 AFTER trigger 分支：`cannot %s "%s" because it has pending trigger events`。其他 55006 报文可能指明数据库用户或逻辑复制槽等不同阻塞者。

## 诊断 {#diagnosis}

确认对象和持有使用状态的具体会话或服务器状态。本案例检查显式事务与命名 cursor；若是待处理 trigger event，应完成或回滚排队它们的事务。遇到数据库或复制路径时，应在终止任何会话前检查 `pg_stat_activity`、复制槽、订阅和维护归属。当前 backend 的 cursor 与其他用户 backend 或逻辑复制槽不是同一种阻塞。

## 处理 {#response}

回滚失败的显式事务，让事务拥有的 cursor 和待处理 trigger event 释放，再在明确的维护边界重做 DDL。数据库用户阻塞要协调持有会话，逻辑复制槽则处理订阅/slot 生命周期。不要把 `CASCADE` 或终止无关会话当作通用处理。

## 实测诊断 {#messages}

选定源码组为 `ERROR`，操作和关系名是动态字段。实测主报文为 `cannot DROP TABLE "cursor_drop_table" because it is being used by active queries in this session`；事务进入 `INERROR`，回滚后恢复为 `IDLE`。

## 代表案例 {#case}

注册表创建一张空表，在同一后端开启事务、声明并 FETCH 命名 cursor，再尝试 `DROP TABLE`；即使没有行，活动 cursor 仍会触发同会话 active-query 分支。真实 55006 后，处理程序在同一连接回滚，再次删除表并确认关系已消失。本案例不代替其他数据库用户、逻辑复制槽或待处理 AFTER-trigger event 路径。

<!-- BEGIN SQLSTATE SNIPPET: active_cursor_drop -->

```sql
CREATE TABLE cursor_drop_table(id integer PRIMARY KEY);
BEGIN;
DECLARE active_cursor CURSOR FOR SELECT id FROM cursor_drop_table;
FETCH active_cursor;
DROP TABLE cursor_drop_table;
ROLLBACK;
DROP TABLE cursor_drop_table;
SELECT to_regclass('cursor_drop_table_regclass')
```

<!-- END SQLSTATE SNIPPET -->

选定的 PostgreSQL 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态或断开恢复、修复、清理和一次性实例停止断言。详见 [`案例 JSON`](../../data/cases/55006.json) 与 [`作者证据`](../../data/evidence/55006.json)。

## 版本 {#versions}

锁定目录从 7.4 起记录 55006。18.6 与 10.21 的活动 cursor DDL 案例均通过；这不代表数据库、复制或待处理触发器路径。

## 相关 {#related}

- [`55000`](../55000/)
- [`55P03`](../55p03/)

## 来源 {#sources}

- `src.errcodes.18.6` — `src/backend/utils/errcodes.txt` at `724edf9bde9d356724ad384a2e196edc3c9f80f7`; blob SHA-256 `6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba` ([source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/errcodes.txt#L425)).
- `src.active-cursor.18.6` — `src/backend/commands/tablecmds.c` at `724edf9bde9d356724ad384a2e196edc3c9f80f7`; blob SHA-256 `422dc8e833df4940755973c757e338295822ba3e4c7266c40669f49f96eb15a9` ([source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/commands/tablecmds.c#L4431-L4435)).
- `src.pending-trigger.18.6` — 同一 `tablecmds.c` 检查待处理 AFTER-trigger event，并在 4439-4444 发出 `cannot %s "%s" because it has pending trigger events` ([source](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/commands/tablecmds.c#L4439-L4444))。
- `src.active-cursor.10.23` — `src/backend/commands/tablecmds.c` at `02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4`; blob SHA-256 `6de441c88496c6cf57a836898388085ec08bf69afd70d07acdafd6089b9b5f8c` ([source](https://github.com/postgres/postgres/blob/02991e79f8f58bc208f05dcc8af0c62dbe0a6ea4/src/backend/commands/tablecmds.c#L3072-L3077)).
- `src.calls.REL_18_6` / `src.calls.REL_10_23` — fixed call scans, SHA-256 `9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf` / `00d16d3eb01b71ccf1b245c8f3102f9d0ec9f36fb02777b8dd1b99fcb263040c`.
- `manifest.55006` / `snippet-registry.55006` — hashes are recorded in `evidence/55006.json` and each selected runtime record.
