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

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

文档 / SQL 状态码 / Class 42 语法错误或访问规则冲突

42704 undefined_object

未定义对象

ERROR 已实测 详解 实测通过

条件名
undefined_object
宏名称
ERRCODE_UNDEFINED_OBJECT
启用版本
7.4
状态
活跃

版本覆盖

速览

SQLSTATE 42704 是 Class 42 中的 undefined_object42704 表示未定义对象。选定 DROP TRIGGER 路径在真实表上指定不存在的触发器,报告 trigger "%s" for table "%s" does not exist;随后可以创建并删除真实触发器。

含义

42704 表示未定义对象。get_trigger_oid 按已解析关系 OID 和触发器名称扫描 pg_trigger;当 DROP TRIGGER 要求对象而没有匹配行时,会发出 ERRORtrigger "%s" for table "%s" does not exist。选定路径在真实表上指定不存在的触发器,随后用创建并删除真实触发器验证修复生命周期。

对象类型决定查找方式和报文:固定分支包括类型名解析失败的 type "%s" does not exist、角色查找失败的 role "%s" does not exist、按关系 OID 扫描约束失败的 constraint "%s" for table "%s" does not exist,以及在访问方法下解析限定名或 search_path 中 opclass 失败的 operator class "%s" does not exist for access method "%s"。选定路径更具体:get_trigger_oid 按关系 OID 和触发器名查 pg_trigger,当前表没有匹配行时发出 trigger "%s" for table "%s" does not exist;随后案例只为验证修复生命周期而创建并删除真实触发器。

诊断

先按主报文分类。对于选定触发器分支,检查 DDL 实际解析到的带 schema 关系、准确触发器名称(包括带引号大小写)和迁移顺序;触发器可能存在于另一张表,但由于源码按关系 OID 和名称查找,在当前关系上仍不存在。对于类型或角色报文,检查准确限定名以及 type/role 目录;对于约束报文,检查关系 OID/名称组合和迁移顺序;对于 opclass 报文,检查访问方法以及 opclass 查找使用的 schema/search_path。schema 缺失或未限定关系不存在属于另一类 namespace/未定义关系诊断,权限失败则是 42501。未找到对象的 ERROR 后选定自动提交会话仍为 IDLE;显式 BEGIN 中它会让事务进入 INERROR,直到 ROLLBACK 或回滚到合适保存点。它不同于 dblink 句柄错误 08003 和预备语句名称错误 26000。

处理

按报文指出的对象类型修复:改正限定名或 search_path,按依赖顺序应用前置迁移,或在对应 owner 的迁移中创建/重命名预期的 type、role、constraint 或 operator class。仅对选定触发器案例,才应显式操作目标关系,核对 owner、时机/事件、行级或语句级定义及函数,并在迁移要求时删除准确触发器。如果对象本来就是可选的,应有意识地选择幂等迁移策略;不要用 CASCADE、无关对象或通用的“先创建再删除”作为修复。显式事务报错后,先回滚事务或合适保存点,再重试。

可复现案例

在一次性实例上执行过的场景。其中 1 个附有可执行 SQL,正文相应小节里给出。

missing_trigger PG 10 / 18 有 SQL

前置条件

  • A runner-owned disposable target is provisioned.
  • PL/pgSQL is available for the repair trigger function.

触发

Drop a named trigger that does not exist on a real table.

断言

  • SQLSTATE is 42704 with a missing-trigger diagnostic
  • The session remains IDLE
  • Creating and dropping a real trigger completes the repair lifecycle

处置

Inspect the relation and trigger name; create or drop the intended trigger explicitly rather than changing unrelated objects.

清理

Drop the case schema with an owner connection.

报文

选定的 get_trigger_oid 分支以明确的 ERROR 发出主报文 trigger "%s" for table "%s" does not exist;触发器名和表名都是动态值。其他固定未定义对象分支发出 type "%s" does not existrole "%s" does not existconstraint "%s" for table "%s" does not existoperator class "%s" does not exist for access method "%s"。只有客户端异常而没有对应对象类型的服务器 SQLSTATE 和主报文时,不能据此识别 42704

报文模板

源码里的格式串,不是某一次运行的输出。%s 之类是占位符,实际报文会填入对象名与取值。适用范围一栏是核验时留下的原始英文记录,未经翻译。

主消息 trigger "%s" for table "%s" does not exist

来源:src/backend/commands/trigger.c @ REL_18_6 · src/backend/commands/trigger.c @ REL_10_23

主消息 type "%s" does not exist

来源:src/backend/catalog/objectaddress.c @ REL_18_6 · src/backend/catalog/objectaddress.c @ REL_10_23

适用范围:Source-only type lookup branch; no natural runtime is claimed.

主消息 role "%s" does not exist

来源:src/backend/commands/user.c @ REL_18_6 · src/backend/commands/user.c @ REL_10_23

适用范围:Source-only DROP ROLE lookup branch; NOTICE missing_ok paths are not selected here.

主消息 constraint "%s" for table "%s" does not exist

来源:src/backend/catalog/pg_constraint.c @ REL_18_6 · src/backend/catalog/pg_constraint.c @ REL_10_23

适用范围:Source-only relation constraint lookup branch; no natural runtime is claimed.

主消息 operator class "%s" does not exist for access method "%s"

来源:src/backend/commands/opclasscmds.c @ REL_18_6 · src/backend/commands/opclasscmds.c @ REL_10_23

适用范围:Source-only access-method/operator-class lookup branch; no natural runtime is claimed.

代表案例

本页使用与运行器注册表相同的语句。执行时,syntax_schemasyntax_role 等生成名称会替换为一次性实例中的实际值。

CREATE TABLE syntax_schema.trigger_table (id integer);
DROP TRIGGER missing_trigger ON syntax_schema.trigger_table;
CREATE FUNCTION syntax_schema.trigger_function() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN RETURN NEW; END $$;
CREATE TRIGGER valid_trigger BEFORE INSERT ON syntax_schema.trigger_table FOR EACH ROW EXECUTE PROCEDURE syntax_schema.trigger_function();
DROP TRIGGER valid_trigger ON syntax_schema.trigger_table;
SELECT count(*) FROM pg_trigger WHERE tgrelid = 'syntax_schema.trigger_table'::regclass AND NOT tgisinternal;

选定的 18.6 运行记录结构化诊断并通过修复断言;10.21 运行通过同一案例的具体检查。可下载的案例和证据投影分别是 42704 案例 JSON作者证据。运行器清单为 verify/cases/42704/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
操作需要唯一排序规则,但无法确定。 活跃