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

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

百科 / 错误代码 / Class 42 语法错误或访问规则冲突

42809 wrong_object_type

对象类型错误

ERROR 已实测 参考 实测通过

条件名
wrong_object_type
宏名称
ERRCODE_WRONG_OBJECT_TYPE
启用版本
7.4
状态
活跃

版本覆盖

速览

42809wrong_object_type(对象类型错误):命令一般有效,但不能作用于该对象种类。本案例尝试在视图上创建行级 BEFORE 触发器。

含义

视图保护路径报告 "%s" is a view,DETAIL 为 Views cannot have row-level BEFORE or AFTER triggers. 检查 pg_class.relkind、事件、级别和时机;它不同于关系不存在或触发器函数体错误。自动提交定义失败后为 IDLE

诊断

检查 pg_class.relkind、触发事件、级别和时机,确认目标是视图还是表;触发器函数体错误发生在后续阶段,诊断不同。

处理

使用对象支持的触发器形式:视图上的行级 INSTEAD OF。如果业务需要 BEFORE/AFTER 行时机,应放在基础表上并明确视图写入语义。本次只验证定义成功,没有验证实际视图 DML。显式事务中被拒绝的触发器定义会使事务进入 INERROR,应先回滚或回到合适的 savepoint 再重试;本案例的自动提交路径回到 IDLE

可复现案例

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

view_row_trigger_type PG 10 / 18 有 SQL

前置条件

  • A runner-owned disposable target is provisioned.

触发

Create a row-level BEFORE trigger on a view.

断言

  • SQLSTATE is 42809 with the view object type and row-trigger detail
  • The failed autocommit session remains IDLE
  • An INSTEAD OF trigger is accepted on the view

处置

Use the trigger kind allowed for the object; a view is not a table and its INSTEAD OF rules do not authorize row-level BEFORE/AFTER triggers.

清理

Drop the runner schema, view, function, and trigger.

实测诊断

固定组是 ERROR,主报文 "%s" is a view,DETAIL 为 Views cannot have row-level BEFORE or AFTER triggers.

报文模板

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

主消息 "%s" is a view
DETAIL Views cannot have row-level BEFORE or AFTER triggers.

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

代表案例

运行器创建视图和函数,先尝试被禁止触发器,再创建 INSTEAD OF 触发器并核对目录行。

CREATE VIEW syntax_schema.trigger_view AS SELECT 1 AS value;
CREATE FUNCTION syntax_schema.trigger_function() RETURNS trigger LANGUAGE plpgsql AS 'BEGIN RETURN NEW; END';
CREATE TRIGGER row_trigger BEFORE INSERT ON syntax_schema.trigger_view FOR EACH ROW EXECUTE PROCEDURE syntax_schema.trigger_function();
CREATE TRIGGER instead_trigger INSTEAD OF INSERT ON syntax_schema.trigger_view FOR EACH ROW EXECUTE PROCEDURE syntax_schema.trigger_function();
SELECT count(*) FROM pg_trigger t JOIN pg_class c ON c.oid = t.tgrelid JOIN pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = 'syntax_schema_name' AND c.relname = 'trigger_view' AND t.tgname = 'instead_trigger' AND NOT t.tgisinternal;

选定的 18.6 与 10.21 运行均通过 SQLSTATE、严重级别、状态/恢复、修复、清理和一次性实例停止断言。详见 案例 JSON作者证据;私有清单和注册表哈希也记录在其中。

版本

锁定目录从 7.4 存在边界起包含该条件并列出相关快照。选定自然案例已在 PostgreSQL 18.6 与 10.21 通过;这是有界观察,不能推断所有中间版本或所有源码分支。

来源

证据

断言

每条断言都写明了是怎么核实的,以及它不覆盖什么。这一层是核验时留下的原始英文记录,照原样呈现,未经翻译。

  • 42809 is the wrong_object_type condition in Class 42.

    核实方式Read fixed errcodes.txt and locked catalogue metadata.

    不覆盖Identity does not identify every backend call that can reuse this SQLSTATE.

    来源src/backend/utils/errcodes.txt

  • The selected view_row_trigger_type follows a resolved PostgreSQL source-call group; other branches can use different dynamic fields.

    核实方式Trace the REL_18_6 and REL_10_23 source-call records at the locked commits.

    不覆盖This is one mechanism boundary, not an exhaustive inventory of the code.

    来源src/backend/commands/trigger.c · src/backend/commands/trigger.c

  • The selected view_row_trigger_type passed on isolated PostgreSQL 18.6 and 10.21 targets.

    核实方式Run the shared SQL registry and inspect SQLSTATE, severity, state, repair, cleanup, and target stop.

    不覆盖Scope is limited to these statements, psycopg, and two versions.

    来源verify/cases/42809/cases.json · verify/cases/42809/snippets.json

  • The locked catalogue records 42809 from the 7.4 presence bound through the listed snapshots; runtime scope is 18.6 and 10.21.

    核实方式Read generated facts, fixed calls, and selected summaries.

    不覆盖Definition presence is not an exact behavioral introduction; two runtime versions do not prove every intermediate behavior.

    来源src/backend/utils/errcodes.txt · raw/calls/REL_18_6.jsonl · raw/calls/REL_10_23.jsonl

运行记录

目标服务器版本结果覆盖案例
latest 18.6 (Homebrew) passed view_row_trigger_type
pg10 10.21 (Debian 10.21-1.pgdg90+1) passed view_row_trigger_type

同类错误代码

Class 42 语法错误或访问规则冲突 下的其他成员。