新行处的Postgresql触发器

新行处的Postgresql触发器,postgresql,triggers,plpgsql,Postgresql,Triggers,Plpgsql,我创造了一个触发器 CREATE TRIGGER trigger_name AFTER INSERT OR UPDATE ON schema.table FOR EACH STATEMENT EXECUTE PROCEDURE audit_trigger(); 这似乎奏效了。然后我有一个函数: CREATE OR REPLACE FUNCTION audit_trigger() RETURNS TRIGGER LANGUAGE 'plpgsql' AS $$ BEGIN UPDATE sch

我创造了一个触发器

CREATE TRIGGER trigger_name
AFTER INSERT OR UPDATE
ON schema.table
FOR EACH STATEMENT
EXECUTE PROCEDURE audit_trigger();
这似乎奏效了。然后我有一个函数:

CREATE OR REPLACE FUNCTION audit_trigger()
RETURNS TRIGGER
LANGUAGE 'plpgsql'
AS $$
BEGIN

UPDATE schema.table SET NEW.changed_at = current_date, NEW.changed_by = current_user ;

END;
$$;
当我在此表中执行插入或更新时,它应自动插入时间和用户名。触发器和函数的创建工作正常(无错误或警告)。但当我在桌子上插入时,我得到:

ERROR: FEHLER:  Spalte »new« von Relation »table« existiert nicht
LINE 1: UPDATE flug.flugplan SET NEW.changed_at = current_date, NEW....
                                 ^
QUERY:  UPDATE schema.tableSET NEW.changed_at = current_date, NEW.changed_by = current_user
CONTEXT:  PL/pgSQL-Funktion audit_trigger() Zeile 6 bei SQL-Anweisung

对于说英语的人:它只是说列>>新建要更新插入/更新行中的字段,您需要执行以下操作:

NEW.changed_at := current_date;   
NEW.changed_by := current_user;
return NEW;
您的代码可能无法按预期工作,因为触发器定义为AFTER trigger,并且不会存储对NEW所做的更改。您需要将其更改为“之前”。
审计触发器通常在触发器之后,因为它们用于记录对表行所做的更改,但在这种情况下,它们不用于更改被审计表中的数据。

即使语法正确,您也不希望这样做,因为您将设置一个递归,因为
UPDATE
会生成一个
UPDATE
,这会生成一个
更新
等等。见@Bjarni Ragnarsson答案。