# 42939 — 保留名称

> PostgreSQL SQLSTATE 42939（reserved_name）的来源与诊断参考。
---

# 42939 — 保留名称

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

`42939`（**reserved_name**）按对象类型拒绝保留名称。选定的 18.6 路径覆盖模式、表空间、创建角色和角色说明语法；必须根据报文中的对象类型判断具体规则。

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

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `42939` |
| 条件名 | `reserved_name` |
| 状态 | `有效` |
| 已知存在于 | `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_RESERVED_NAME` |
| 别名 | `—` |

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

## 含义 {#meaning}

创建模式时，保留的 `pg_` 前缀会触发 `unacceptable schema name "%s"` 及系统模式 DETAIL；创建表空间有对应的系统表空间报文。`CREATE ROLE` 对 `pg_` 前缀报告 `role name "%s" is reserved`。此外，语法中的 `RoleId` 在角色名位置拒绝 `public`、`none`、`SESSION_USER`、`CURRENT_USER` 和 `CURRENT_ROLE`：`public`、`none` 使用保留角色名主消息，后三个当前/会话标记使用 `%s cannot be used as a role name here`。这些规则不表示这些单词在所有标识符位置都保留。

## 诊断 {#diagnosis}

先读取主消息和 DETAIL。`unacceptable schema name` 指向模式前缀检查，`unacceptable tablespace name` 指向表空间检查，`role name ... is reserved` 可能是 `pg_` 角色或语法中的 `public`/`none`，`%s cannot be used as a role name here` 则明确是角色说明标记。语法错误应检查角色名所在的命令位置，而不是先查 `pg_namespace` 或 `pg_authid`；不能只凭 SQLSTATE 判断。

## 处理 {#response}

选择允许的对象名称并检查迁移与所有权。若是角色说明语法错误，应在该位置改用允许的实际角色标识符；改 `search_path` 不能替代修正命令。不要删除系统对象或重复同名重试。对象级 `ERROR` 若发生在显式事务中，应先回滚到保存点或回滚事务再重试。

## 消息变体 {#messages}

选定路径均为 `ERROR`，具体主消息/DETAIL 如下：

- 模式：`unacceptable schema name "%s"`，DETAIL 为 `The prefix "pg_" is reserved for system schemas.`
- 表空间：`unacceptable tablespace name "%s"`，DETAIL 为 `The prefix "pg_" is reserved for system tablespaces.`
- `pg_` 角色：`role name "%s" is reserved`，DETAIL 为 `Role names starting with "pg_" are reserved.`
- 角色语法：`public`/`none` 使用 `role name "%s" is reserved`，`SESSION_USER`、`CURRENT_USER`、`CURRENT_ROLE` 使用 `%s cannot be used as a role name here`。

## 版本 {#versions}

目录锁定范围从 7.4 下界到 18.6、19beta3；这是条件目录下界，不是每个对象规则的共同引入版本。本页机制只做源码确认，未运行数据库。

## 相关 {#related}

- [`42704`](../42704/)
- [`42P06`](../42p06/)
- [`42710`](../42710/)

## 来源 {#sources}
- `src.errcodes.42939.18.6` — `src/backend/utils/errcodes.txt` line 349，固定于 `724edf9bde9d356724ad384a2e196edc3c9f80f7`；SHA-256 `6e8de346643ba84aa3c9c6a73360acfc7b2dfb89162c06c08ce9bf5bcd5bbcba`（[源码](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/errcodes.txt#L349)）。

- `src.call.42939.baa3c4599e167695f281cfe8` — `src/backend/commands/schemacmds.c` lines 107-110，固定于 `724edf9bde9d356724ad384a2e196edc3c9f80f7`；SHA-256 `5fd5f43dce5f36f06ed390014c06f244564072227d25a22735f594d2170626b1`（[源码](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/commands/schemacmds.c#L107-L110)）。
- `src.call.42939.aed179efd45a7ca409d59fd6` — `src/backend/commands/tablespace.c` lines 281-285，固定于 `724edf9bde9d356724ad384a2e196edc3c9f80f7`；SHA-256 `f0369bece6339d18cd7d4a29b5fa3010447c3b8ece235c64b0d4fbf5f96a5317`（[源码](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/commands/tablespace.c#L281-L285)）。
- `src.call.42939.419595a34cae2a69b2e21624` — `src/backend/commands/user.c` lines 352-356，固定于 `724edf9bde9d356724ad384a2e196edc3c9f80f7`；SHA-256 `aa8769a2577fff287301d6c82169262cca328515ae940d5a2be4b3e8c21617ed`（[源码](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/commands/user.c#L352-L356)）。
- `src.call.42939.role-grammar` — `src/backend/parser/gram.y` lines 17460-17542，固定于 `724edf9bde9d356724ad384a2e196edc3c9f80f7`；SHA-256 `7e548b673a1e03eb3a56c5eb9ad92d8e11095fac76e14cb258ca851f58274724`（[源码](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/parser/gram.y#L17460-L17542)）。
- `src.calls.REL_18_6.42939` — 固定本地核心调用扫描；SHA-256 `9ee8a0e81d8f0825c5c1ae45583439859a26e602bdd4ce2f2a62aa278867ccbf`。
- [`作者证据`](../../data/evidence/42939.json) — 记录源码断言、消息角色和运行边界。
