выполнить триггер, прежде чем произойдет какое-либо удаление - PullRequest
0 голосов
/ 06 сентября 2018

Проблема в том, что мой триггер (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 не будет вызывать мой триггер до удаления родителя, но делает именно это: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...