新行的 Postgresql 触发器
Postgresql trigger at new row
我创建了一个触发器
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;
$$;
当我在此 table 执行插入或更新时,它应该会自动插入用户的时间和名称。触发器的创建和功能正常工作(没有错误或警告)。但是当我在 table 处执行 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
对于说英语的人:它只是说 table 中的 >>new<< 列不存在。
要更新 inserted/updated 行中的字段,您需要执行如下操作:
NEW.changed_at := current_date;
NEW.changed_by := current_user;
return NEW;
您的代码可能无法按预期工作,因为触发器被定义为 AFTER 触发器并且不会存储对 NEW 所做的更改。您需要将其更改为 BEFORE。
审计触发器确实通常在触发器之后,因为它们用于记录对 table 行所做的更改,但在这种情况下,它们不用于更改正在审计的 table 中的数据。
我创建了一个触发器
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;
$$;
当我在此 table 执行插入或更新时,它应该会自动插入用户的时间和名称。触发器的创建和功能正常工作(没有错误或警告)。但是当我在 table 处执行 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
对于说英语的人:它只是说 table 中的 >>new<< 列不存在。
要更新 inserted/updated 行中的字段,您需要执行如下操作:
NEW.changed_at := current_date;
NEW.changed_by := current_user;
return NEW;
您的代码可能无法按预期工作,因为触发器被定义为 AFTER 触发器并且不会存储对 NEW 所做的更改。您需要将其更改为 BEFORE。 审计触发器确实通常在触发器之后,因为它们用于记录对 table 行所做的更改,但在这种情况下,它们不用于更改正在审计的 table 中的数据。