У меня волосатая система с почти 650 взаимосвязанными таблицами (с большим количеством двунаправленных ссылок), которая создается с помощью скрипта Hibernate. Мне нужно удалить оставшиеся (поврежденные) данные на основе идентификатора, который присутствует во всех таблицах. Я написал скрипт для генерации процедур для отключения ограничений для каждой из таблиц, например ::10000
create or replace procedure disable_MyTable as
BEGIN
FOR r IN (
SELECT TABLE_NAME, CONSTRAINT_NAME
FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'MyTable') LOOP
EXECUTE IMMEDIATE REPLACE(REPLACE(
'ALTER TABLE #TABLE# DISABLE CONSTRAINT #CON#'
,'#TABLE#',r.TABLE_NAME)
,'#CON#',r.CONSTRAINT_NAME);
END LOOP;
END;
/
Далее:
exec disable_MyTable;
После моего удаления, после чего я иногда получаю эту ошибку:
ORA-02292: integrity constraint (XXX.FK409) violated - child record found
Когда я проверяю статус ограничений:
select status from user_constraints where table_name = 'MyTable';
Oracle говорит, что все ограничения все еще ENABLED !
Процедуры выполняются в своем собственном экземпляре? Нужны ли мне более высокие привилегии?
p.s. Я не забочусь о производительности. Это всего лишь сценарий очистки.