Проблема в том, что мой триггер (ON DELETE
) выполняется после того, как родительские записи были удалены, и к тому моменту, когда запись внука выполняет свой триггер, я не могу ничего сделать полезного, так как потерял данные.
У меня есть родительская таблица (tokens_processed
)
CREATE TABLE tokens_processed (
block_num INT PRIMARY KEY NOT NULL REFERENCES lock(block_num) ON DELETE CASCADE,
done boolean DEFAULT FALSE
);
2 дочерних таблицы (tokop
и approval
):
CREATE TABLE tokop (
tokop_id BIGSERIAL PRIMARY KEY,
block_num INT NOT NULL REFERENCES tokens_processed(block_num) ON DELETE CASCADE,
...
)
CREATE TABLE approval (
approval_id BIGSERIAL PRIMARY KEY,
block_num INT NOT NULL REFERENCES tokens_processed(block_num) ON DELETE CASCADE,
...
)
И внучатый стол:
CREATE TABLE tokop_approval (
tokop_id BIGINT NOT NULL REFERENCES tokop(tokop_id) ON DELETE CASCADE,
approval_id BIGINT NOT NULL REFERENCES approval(approval_id) ON DELETE CASCADE
);
Триггер определен так:
CREATE OR REPLACE FUNCTION tkapr_delete() RETURNS trigger AS $$
SELECT contract_id,from_id,to_id,value FROM tokop WHERE tokop_id=OLD.tokop_id INTO v_contract_id,v_from_id,v_to_id,v_value;
GET DIAGNOSTICS v_cnt = ROW_COUNT;
RAISE NOTICE 'contract_id=%, value=% tokop_id=%, v_cnt=%',v_contract_id,v_value,OLD.tokop_id,v_cnt;
...
END;
CREATE TRIGGER tkapr_insert AFTER INSERT ON tokop_approval FOR EACH ROW EXECUTE PROCEDURE tkapr_insert();
CREATE TRIGGER tkapr_delete BEFORE DELETE ON tokop_approval FOR EACH ROW EXECUTE PROCEDURE tkapr_delete();
Когда я удаляю запись из tokens_processed
, триггер выполняется на tokop_approval
, и он показывает, что родительская запись уже была удалена. Однако мне нужно, чтобы родитель обновил некоторые поля в других таблицах.
Вывод уведомления подтверждает это:
NOTICE: contract_id=<NULL>, value=<NULL> tokop_id=131, v_cnt=0
Как выполнить триггер ДО того, как все родительские записи (родитель и его дочерние элементы) будут удалены? Потому что сейчас, когда запускается триггер, мне не хватает необходимых данных для продолжения моего процесса и обновления некоторых других таблиц. Причина, по которой я создал ограничения внешнего ключа (REFERENCES
), состоит в том, чтобы убедиться, что Postgres не будет вызывать мой триггер до удаления родителя, но делает именно это: (