SELECT на той же таблице ПОСЛЕ INSERT TRIGGER не удается? - PullRequest
0 голосов
/ 05 февраля 2020

Я пишу небольшой триггер AFTER INSERT, который выполняется после вставки строки в таблицу A. Настолько упрощенно, мы получили следующие три таблицы:

CREATE TABLE A (Id INTEGER, datum DATE, ...);
CREATE TABLE B (Id INTEGER, ...);
CREATE TABLE C (Id INTEGER, Aref INTEGER, Bref INTEGER, FOREIGN KEY(Aref) REFERENCES A(Id), FOREIGN KEY(Bref) REFERENCES B(Id));

Итак, теперь сложность состоит в том, что строки из таблицы B следует выбирать только в том случае, если на них ИХ вообще не ссылаются в таблице C ИЛИ, если на них ссылаются в таблице C, на поле данных в строке A также ссылаются в этой строке C НЕ НУЛЬ. Вы получаете это? Поэтому я попытал счастья с предложением select, которое выглядело следующим образом:

SELECT * FROM B b WHERE NOT EXISTS(SELECT c.* FROM C c, A a WHERE c.Bref = b.Id AND c.Aref = A.Id and a.datum IS NULL);

Так что теперь триггер вызывает исключение, потому что «таблица изменена в данный момент, и триггер, вероятно, не мог ее увидеть», цитируется сообщение об ошибке. Но мне нужна информация таблицы A, и мне нужно, чтобы она была триггером AFTER INSERT, потому что этот же триггер использует эти строки для самого вычисления, вставляя строки в таблицу D со ссылкой на эту строку A. Итак, теперь вопрос в том, как можно выбрать эти строки A после вставки и убедиться, что они остаются согласованными?

...