Измените OLD для возврата DELETE в триггерной функции postgresql - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть функция триггера в 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();           
...