Можно ли временно отключить каскадное удаление в Oracle? - PullRequest
1 голос
/ 05 января 2012

Время от времени мне приходится удалять пользователя из нашей базы данных. Пользователи хранятся в таблице с именем TPM_USER. Проблема в том, что есть куча таблиц с ограничением внешнего ключа на TPM_USER.USERID. Что еще хуже, эти ограничения используют ON CASCADE DELETE. На днях я удалил пользователя, который, по моему мнению, ничем не использовался (это был дубликат пользователя, ошибочно созданного за несколько часов до этого), но он удалил кучу важных данных без предупреждения.

Лично я ненавижу каскадные удаления. Я думаю, что они опасны и должны использоваться, только если эти две сущности действительно взаимозависимы. Я бы хотел удалить их все, но эта схема довольно сложна, и, вероятно, она будет слишком большой, чтобы от нее откусить.

Мой вопрос: Перед выполнением оператора DELETE для TPM_USER могу ли я попросить Oracle точно сказать, что будет удалено в результате? Или я могу временно отключить любое каскадирование и получить ошибку, если вместо этого будут нарушены какие-либо внешние ключи?

Спасибо!

1 Ответ

4 голосов
/ 05 января 2012

Отвечая на ваш вопрос, я не знаю простого способа показать, что будет удалено в операторе каскадного удаления. Вы можете написать его, но это будет довольно сложно, так как вам придется обходить дерево зависимостей динамически, показывая только записи, соответствующие вашим критериям удаления.

В любом случае, вы можете отключить ограничение, используя:

alter table TABLE_NAME disable constraint FK_CONSTRAINT_NAME;

(используйте «enable» для его повторного включения).

Очевидно, вы должны знать, что если вы сделаете это, и другой пользователь удалит из той же таблицы, то Oracle не будет применять это ограничение, и могут случиться плохие вещи.

Вы можете получить список всех имен таблиц / ограничений, ссылающихся на TPM_USER.USERID, с помощью:

select table_name, constraint_name from user_constraints 
  where r_constraint_name in (
    select constraint_name 
    from user_constraints
    where constraint_type = 'P'
    and table_name = 'TPM_USER' ); 

(используйте all_constraints, если у вас есть зависимости между схемами)

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