我有一个非常简单的触发器:

CREATE OR REPLACE FUNCTION f_log_datei()
RETURNS TRIGGER AS $$
BEGIN
  INSERT INTO logs (aktion, tabelle, benutzer_id) VALUES(TG_OP, 'dateien', NEW.benutzer_id);
END; $$ LANGUAGE 'plpgsql';

CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();

我的表格日志(log)如下:

CREATE TABLE logs(
    id int PRIMARY KEY DEFAULT NEXTVAL('logs_id_seq'),
    zeit timestamp DEFAULT now(),
    aktion char(6),
    tabelle varchar(32),
    alt varchar(256),
    neu varchar(256),
    benutzer_id int references benutzer(id)
);

在dateien中插入某些内容后,我出现以下错误:

ERROR:  record "new" is not assigned yet
DETAIL:  The tuple structure of a not-yet-assigned record is indeterminate.
CONTEXT:  SQL statement "INSERT INTO logs (aktion, tabelle, benutzer_id) VALUES(TG_OP, 'dateien', NEW.benutzer_id)"
PL/pgSQL function "f_log_datei" line 3 at SQL statement

为什么我会犯这个错误?我查看了文档,他们似乎用了和我一样的新方法.

推荐答案

fine manual人中:

36.1. Overview of Trigger Behavior

Trigger Procedures开始:

NEW

注意level语句表示什么触发了row.

您有一个语句级触发器:

...
FOR EACH STATEMENT
EXECUTE PROCEDURE f_log_datei();

每个语句都会触发一次语句级触发器,并且一个语句可以应用于多行,因此affected row的概念(NEWOLD就是关于这个的)根本不适用.

如果要在触发器中使用NEW(或OLD),则需要 for each 受影响的行执行触发器,这意味着您需要一个行级触发器:

CREATE TRIGGER log_datei AFTER INSERT OR UPDATE OR DELETE
ON dateien
FOR EACH ROW
EXECUTE PROCEDURE f_log_datei();

我刚把FOR EACH STATEMENT改成FOR EACH ROW.


你的触发器也应该是be returning something:

触发器函数必须返回NULL或记录/行值,该值必须与触发触发器的表的 struct 完全相同

所以你的扳机应该是RETURN NEW;RETURN NULL;.你有一个后触发器,所以你使用哪种返回并不重要,但我会 Select RETURN NEW;.

Postgresql相关问答推荐

如何使用Docker安装PostgreSQL扩展

横向联接返回的行数太多

Postgresql我必须创建一个索引还是已经有一个索引了?

我可以将jsonb_set与来自SELECT语句的新值(第三个参数)一起使用吗?

返回行值和行计数的总和

如何计算每月的出版物数量?

在 PostgreSQL 中 Select 数字命名列会返回 ?column?

PostgreSQL:在timestamp::DATE 上创建索引

如何从 postgresql Select 查询中的 age() 函数中仅获取年份

如何在 PostgreSQL 中截断日期?

SQLAlchemy 中使用什么类型存储字节字符串?

在 PostgreSQL docker 镜像中创建表

statement_date列是日期类型,但表达式是整数类型

如何正确索引多对多关联表?

使用 PostgreSQL 创建数据透视表

如何使用 Django Migrations 重新创建已删除的表?

错误:ERROR: table name specified more than once

具有 DEFAULT NULL 的 MySQL 列 ?

根据 Helm 图表设置值

JOIN (SELECT ... ) ue ON 1=1?