# 2F002 — modifying_sql_data_not_permitted

> PostgreSQL SQLSTATE 2F002 的源码边界与诊断参考。
---

# 2F002

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

SQLSTATE 2F002 是 SQL Routine Exception 中表示例程声明的数据访问契约不允许修改 SQL 数据的标准成员。锁定的 PostgreSQL 18.6 定义包含该成员，但已解析的 core/contrib 调用扫描没有找到原生报告调用组。不能据此推断 PostgreSQL 的 `VOLATILE`、`STABLE` 或 `IMMUTABLE` 单独会映射到此 SQLSTATE。

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

| 字段 | 值 |
| --- | --- |
| SQLSTATE | `2F002` |
| 条件名 | `modifying_sql_data_not_permitted` |
| 状态 | `有效` |
| 已知存在于 | `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_S_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED` |
| 别名 | `—` |

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

## 含义 {#meaning}

该条件描述某个实现执行例程数据访问契约时的限制。PostgreSQL 目录行只提供身份和宏，并未证明后端存在执行该限制的路径，也未指定某种例程语言。扩展、嵌入式 SQL 实现、驱动或远端服务器可能独立使用这个标准成员。

## 消息 {#messages}

由于有界扫描没有解析出原生报告调用，本页不采用未经确认的 PostgreSQL 固定消息变体。

## 诊断 {#diagnosis}

先保留实际 SQLSTATE，并检查例程声明以及执行限制的所有者。确认尝试的语句是否修改数据、例程是否声明了限制性的数据访问特征，以及代码来自远端还是客户端实现。如果服务器返回其他代码，应按那个代码处理，不要把 2F002 当成 PostgreSQL 函数 volatility 错误的同义词。

## 处理 {#response}

只有在实际产生者文档明确支持时，才修改例程的数据访问声明，或把修改数据的工作移到允许的例程边界。否则应修正调用方或远端契约。不要加入通用重试：数据修改被拒绝本身不能说明周围工作是否已提交。

## 版本 {#versions}

锁定目录将该条件的已知下界记为 PostgreSQL 7.4。事实块列出已发布快照；源码路径状态仅限于下方固定的 PostgreSQL 18.6 资料。

## 相关 {#related}

[`2F000`](../2f000/), [`0A000`](../0a000/)

## 来源 {#sources}

固定的[errcodes 定义](https://github.com/postgres/postgres/blob/724edf9bde9d356724ad384a2e196edc3c9f80f7/src/backend/utils/errcodes.txt#L290)确认成员和宏；[SQLSTATE 附录](https://www.postgresql.org/docs/18/errcodes-appendix.html)标识标准条件。锁定的 core/contrib 扫描未找到已解析的原生 2F002 报告调用组。 详见结构化[证据记录](../../data/evidence/2f002.json)，其中记录固定源码路径、扫描范围和未解决的运行边界。
