postgresql触发器函数中修改OLD为DELETE返回

Modify OLD to be returned by DELETE in postgresql trigger function

我在 postgresql 中有一个触发器函数,它将在审计 table 中插入行以执行 INSERT、UPDATE 和 DELETE 操作。在我的 tables 中,有一个名为 audit_id 的列,我需要写入插入的 audit 行的 ID在这个领域里。这是我的功能

CREATE OR REPLACE FUNCTION my_audit_trigger()
 RETURNS trigger LANGUAGE plpgsql
AS $function$
declare
  audit_pk bigint;
begin
IF TG_OP = 'INSERT'
THEN
INSERT INTO audit.table_audit (rel_id, table_name, operation, after)
VALUES (TG_RELID, TG_TABLE_NAME, TG_OP, to_jsonb(NEW)) returning id into audit_pk;
 NEW.audit_id := audit_pk;
RETURN NEW;
ELSIF TG_OP = 'UPDATE'
THEN
IF NEW != OLD THEN
 INSERT INTO audit.table_audit (rel_id, table_name, operation, before, after)
VALUES (TG_RELID, TG_TABLE_NAME, TG_OP, to_jsonb(OLD), to_jsonb(NEW)) returning id into audit_pk;
END IF;
 NEW.audit_id := audit_pk;
RETURN NEW;
ELSIF TG_OP = 'DELETE'
THEN
INSERT INTO audit.table_audit (rel_id, table_name, operation, before)
VALUES (TG_RELID, TG_TABLE_NAME, TG_OP, to_jsonb(OLD)) returning id into audit_pk;
OLD.audit_id := audit_pk;
RETURN OLD;
END IF;
end;
$function$;

因此,当插入或更新我的 table 行时,我取回了相应操作的审计 ID,但是当我执行 运行 DELETE 命令时,我取回了以前的操作,而不是 DELETE 本身。所以我猜问题出在 OLD.audit_id := audit_pk;

更具体地说,我 运行 例如 INSERT INTO table VALUES (this, that) RETURNING audit_id 并且我返回 audit_id INSERT 操作。

之后,当 运行ning DELETE FROM table WHERE id = sth RETURNING audit_id 我得到 audit_id INSERT 操作,而不是 DELETE。

感谢任何帮助,谢谢。

P.S。这就是我创建触发器的方式

CREATE TRIGGER table_trigger
BEFORE INSERT OR UPDATE OR DELETE
ON table
FOR EACH ROW
EXECUTE PROCEDURE my_audit_trigger();           

我有类似的问题。看来PG现在不支持修改OLD了,不过估计这个功能会被加入TODO列表吧

目前您只能修改 新的 INSERT 和 UPDATE 语句

有关详细信息,请查看此邮件线程:Does 'instead of delete' trigger support modification of OLD