Oracle 10g Express: DISABLE CONSTRAINT на самом деле не отключает ограничения? - PullRequest
0 голосов
/ 30 августа 2011

У меня волосатая система с почти 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. Я не забочусь о производительности. Это всего лишь сценарий очистки.

1 Ответ

2 голосов
/ 30 августа 2011

Если оператор select status from user_constraints where table_name = 'MyTable' действительно возвращает строку, то вам необходимо поместить двойные кавычки вокруг заполнителя # TABLE # в вашем выражении ALTER.Потому что в этом случае MyTable чувствителен к регистру и требует двойных кавычек.

Вы генерируете следующий оператор

ALTER TABLE MyTable DISABLE CONSTRAINT FK409ADEF4HERW;

Но это должно быть:

ALTER TABLE "MyTable" DISABLE CONSTRAINT FK409ADEF4HERW;

Снова это предполагает, что ваш оператор SELECT использовал 'MyTable', как показано

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