У меня есть внешний ключ в таблице B в таблице A. Что я хочу, это удаление записи в A, использование каскадного удаления ИЛИ каскадного набора NULL в поле FK в B зависит от значение в некотором столбце этой записи, которое должно быть удалено.oracle on delete cascade с условием
Насколько я могу использовать условие в удалении каскада, мои идеи были всегда использовать каскадный SET NULL и добавить триггер для таблицы B
AFTER UPDATE..
FOR EACH ROW
BEGIN
IF :new.a = 1 THEN
DELETE FROM B WHERE ID = :new.id
ENDIF;
END;
Но я получаю сообщение об ошибке, smthing как «таблица мутирует, триггер/функция может не видеть его ».
Итак, я изменил мой, если-то еще, чтобы вызов процедуры
AFTER UPDATE
BEGIN
cleanup_table_b();
END;
create or replace procedure cleanup_table_b
IS begin
DELETE FROM B WHERE a = 1;
end;
Но все-таки получить ошибку ORA-04091, ORA-06512, ORA-04088
Бизнес идея о том, записи в B могут по-прежнему быть полезными (а не внешними ключами) или нет, поэтому я хочу выполнить очистку и удалить записи о единстве.
Используйте триггер delete для таблицы A для удаления или установки нулевой ссылки на записи в таблице B. – Rene
@ Рене да, но это делает один стол для поддержания другого. Лучшее структурное решение было бы, если бы таблица могла поддерживать себя. – user1448906
Вы должны объяснить, почему вы думаете, что это «лучше». – Rene