Получение ORA-00001(уникальное ограничение нарушено) при COMMITing?
Мы получаем ORA-00001 (уникальное ограничение нарушено) в пакетном задании. Однако ошибка возникает при выполнении команды COMMIT, а не во время вставки ошибочной записи.
Вопросы:
- Как получилось, что уникальное ограничение проверяется в COMMIT? (Есть ли какие-то настройки, которые мы можем использовать, чтобы проверка происходила во время ВСТАВКИ?)
- Как мы можем обнаружить нарушающую SQL/ запись, которая приводит к уникальному нарушению ограничения?
Любая помощь приветствуется!
Дополнительная информация / Вопрос:
"Оскорбительное" ограничение помечается как НЕМЕДЛЕННОЕ и НЕДОРОЖНОЕ. Может ли это быть переопределено в транзакции?
2 ответа
Ограничения могут быть помечены / определены как отложенные. В этом случае проверки ограничений могут быть "немедленными" или "отложенными". При определении ограничения вы можете установить значение по умолчанию / начальное значение, initially immediate
или же initially deferred
, Когда установлено deferred
ограничение применяется только до тех пор, пока вы не совершите транзакцию.
Вы можете изменить поведение отложенных ограничений, например, через
set constraints all immediate;
см. также: http://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html
Ограничения могут быть определены как отложенные, что означает, что они проверяются при фиксации, а не во время изменения данных. Смотрите следующие 2 ссылки:
http://www.oracle-base.com/articles/8i/ConstraintCheckingUpdates.php
http://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html
Надеюсь, поможет