【问题标题】:Postgresql trigger at new row新行的 Postgresql 触发器
【发布时间】: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


【解决方案1】:

要更新插入/更新行中的字段,您需要执行以下操作:

NEW.changed_at := current_date;   
NEW.changed_by := current_user;
return NEW;

您的代码可能无法按预期工作,因为触发器被定义为 AFTER 触发器,并且对 NEW 所做的更改不会被存储。您需要将其更改为 BEFORE。 审计触发器确实经常在触发器之后,因为它们用于记录对表行所做的更改,但在这种情况下,它们不用于更改被审计表中的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多