【发布时间】:2021-01-14 04:39:32
【问题描述】:
我创建了一个触发器
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;
$$;
当我在这个表上执行 INSERT 或 UPDATE 时,它应该会自动插入时间和用户名。触发器的创建和函数正常工作(没有错误或警告)。但是当我在桌子上做 INSERT 时,我得到了这个:
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
【问题讨论】:
-
即使你的语法正确,你也不想这样做,因为你会设置一个递归,因为
UPDATE产生一个UPDATE,它产生一个UPDATE等等。请参阅@Bjarni Ragnarsson 的答案。
标签: postgresql triggers plpgsql