2016-11-22 2 views
0

У меня есть внешний ключ в таблице 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 могут по-прежнему быть полезными (а не внешними ключами) или нет, поэтому я хочу выполнить очистку и удалить записи о единстве.

+1

Используйте триггер delete для таблицы A для удаления или установки нулевой ссылки на записи в таблице B. – Rene

+0

@ Рене да, но это делает один стол для поддержания другого. Лучшее структурное решение было бы, если бы таблица могла поддерживать себя. – user1448906

+0

Вы должны объяснить, почему вы думаете, что это «лучше». – Rene

ответ

0

Следующее предписание было реализовано. Был использован триггер «on delete» в таблице A, чтобы удалить или установить нулевые ссылочные записи в таблице B. Таким образом, удаление триггера запускает очистку B

Смежные вопросы