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

修改postgresql触发器函数中的DELETE返回的OLD,sql,postgresql,triggers,sql-function,postgresql-triggers,Sql,Postgresql,Triggers,Sql Function,Postgresql Triggers,我在postgresql中有一个触发器函数,它将在插入、更新和删除操作时在审计表中插入行。在我的表中,有一个名为audit_id的列,我需要在该字段中写入插入的审计行的id。这是我的职责 CREATE OR REPLACE FUNCTION my_audit_trigger() RETURNS trigger LANGUAGE plpgsql AS $function$ declare audit_pk bigint; begin IF TG_OP = 'INSERT' THEN INSE

我在postgresql中有一个触发器函数,它将在插入、更新和删除操作时在审计表中插入行。在我的表中,有一个名为audit_id的列,我需要在该字段中写入插入的审计行的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$;
因此,在插入或更新表行时,我会返回相应操作的审核id,但在运行DELETE命令时,我会返回上一个操作的审核id,而不是DELETE本身的审核id。所以我猜问题出在
OLD.audit\u id:=audit\u pk

更具体地说,我运行例如
INSERT-INTO-table-VALUES(this,that)返回audit\u id
,然后返回INSERT操作的audit\u id

之后,当从id=sth返回audit\u id的表中运行
DELETE时,我得到的是INSERT操作的audit\u id,而不是DELETE操作的audit\u id

非常感谢您的帮助,谢谢

注意,这就是我创建触发器的方式

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

我也有类似的问题。这似乎PG不支持修改旧的now,但是,这个特性可能会包含在TODO列表中

当前,您只能修改INSERT和UPDATE语句的新建


有关详细信息,请查看此邮件线程:

我不太明白。如何从
删除中“找回”某些内容?欢迎使用StackOverflow!您可以通过共享您看到的输出和您期望的结果来改进您的问题吗?当我运行``DELETE FROM table WHERE id=12 RETURNING*``时,我得到一行由触发器函数返回,我们无法看到返回到
audit\u pk
中的
id
字段如何获得其值,因为insert语句中未指定该字段。问题一定就在那里——该值来自何处,为什么要将其设置为意外值?我在触发器本身中看不到任何问题,它必须在审计表中的实际数据中。请记住,insert或update语句写入的甚至不是表,那么在
affiliate\u audit
表中如何设置该值?只有您有权访问该信息才能找到答案。@404在审计表中的每次插入都会自动生成id。我认为这部分是可以的,因为它的工作原理完全符合插入和更新的预期。运行DELETE时,OLD包含要删除的整行,包括上一个操作的audit_id。我想做的是用一个新的审计id更新旧的审计id,但这不起作用,我不知道为什么