У меня есть функция триггера в postgresql, которая вставляет строки в таблицу аудита при операциях INSERT, UPDATE и DELETE.В моих таблицах есть столбец с именем audit_id , и мне нужно написать идентификатор вставленной строки audit в этом поле.Это моя функция
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$;
В результате при вставке или обновлении строк в моей таблице я получаю идентификатор аудита соответствующей операции, но когда я запускаю команду DELETE, я возвращаю идентификатор аудитапредыдущая операция, а не самого УДАЛЕНИЯ.Таким образом, я предполагаю, что проблема в OLD.audit_id := audit_pk;
Более конкретно, я запускаю, например, INSERT INTO table VALUES (this, that) RETURNING audit_id
, и я получаю Audit_id операции INSERT.
После того, как при запуске DELETE FROM table WHERE id = sth RETURNING audit_id
я получаю aud_id операции INSERT, а не DELETE.
Любая помощь приветствуется, спасибо.
PS Вот какЯ создаю триггер
CREATE TRIGGER table_trigger
BEFORE INSERT OR UPDATE OR DELETE
ON table
FOR EACH ROW
EXECUTE PROCEDURE my_audit_trigger();