Нарушение уникального ограничения Oracle, ссылающееся на несуществующее ограничение

Я получаю сообщение об ошибке, которое не могу понять. Ошибка довольно проста:

ORA-00001: unique constraint (*schema*.*xyz_constraint*) violated

Однако мое замешательство вызывает тот факт, что такого ограничения, по-видимому, не существует. Это определенно не определено в таблице; рассматриваемая БД почти не имеет определенной ссылочной целостности, а конкретная таблица, в которую я вставляю данные, не имеет определенного ключа.

Что бы это ни стоило, я не могу найти ограничение нигде в базе данных:

    select *
    from all_constraints 
    where constraint_name like '%xyz_constraint%'

Есть ли что-то, что я упускаю из виду? Спасибо.


person Ickster    schedule 17.01.2012    source источник
comment
Если предпринимается попытка создать дубликат уникального индекса, Oracle сообщит о нарушении уникального ограничения. Поэтому я бы предложил искать уникальные индексы в дополнение к ограничениям.   -  person Shannon Severance    schedule 17.01.2012
comment
Вы можете найти свои индексы в таблице all_indexes. Вы можете сделать: select index_name, table_name, uniqueness from all_indexes where upper(index_name) = upper('xyz_constraint'); чтобы найти, какая таблица имеет этот индекс.   -  person ViníciusPJ    schedule 18.02.2020


Ответы (3)


Это происходит, когда ограничение принадлежит другому пользователю и у вас нет на него прав.

Попробуйте посмотреть еще раз с точки зрения SYS

person zerkms    schedule 17.01.2012
comment
Мне придется нанять одного из администраторов баз данных. Естественно, у меня нет доступа SYS к схеме. Будет интересно посмотреть, что случилось, так как это было в разработке более двух лет без проблем с ограничениями. Сегодня у меня 600 ошибок. Спасибо за ответ; Я дам вам знать, что я найду. - person Ickster; 17.01.2012
comment
@Ickster: я не помню причин, но у меня было точно такое же поведение, и это было то, что я сказал ;-) В любом случае, удачи в ваших исследованиях и с нетерпением жду подробностей, что это было на самом деле в вашем случае. - person zerkms; 17.01.2012
comment
Вместо этого просто запросите DBA_CONSTRAINTS. Если у вас есть доступ к этому представлению, то, если ограничение существует, оно будет там. SYS не обязательно требуется - SYSTEM также будет иметь к нему доступ. - person Jeffrey Kemp; 17.01.2012
comment
@Джеффри Кемп - спасибо за предложение. К сожалению, у меня тоже нет доступа к этому представлению. Нашим администраторам баз данных нравится следить за тем, чтобы никто не мог ничего понять, не попросив их о помощи. А потом жалуются, что их просят о помощи ;-) - person Ickster; 17.01.2012
comment
Шиш. Прошли годы, но я должен упомянуть, что на самом деле это была проблема с разрешениями, как предположил @zerkms. Наш администратор базы данных смог решить эту проблему. - person Ickster; 06.05.2016

У меня была точно такая же ошибка, и это не была проблема с разрешениями. Скорее, объект оказался INDEX, а не CONSTRAINT, и я нашел его с помощью:

SELECT * FROM ALL_INDEXES WHERE INDEX_NAME LIKE '%XYZ_UK1'

...потому что его не было в ALL_CONSTRAINTS или DBA_CONSTRAINTS. Смущает, как сообщение об ошибке такое же. Я использую Oracle 11g.

person Brian    schedule 05.04.2018
comment
Спасибо, у меня была точно такая же проблема, и это сводило меня с ума, мне никогда не приходило в голову проверять индексы вместо ограничений - person AJPerez; 25.11.2019

Имена объектов схемы почти всегда сохраняются в верхнем регистре. Пытаться

select *
from all_constraints 
where constraint_name like '%XYZ_CONSTRAINT%'

ORA-00001 обычно возникает при дублировании первичных ключей. Вы уверены, что у вас его нет на столе?

person Thilo    schedule 17.01.2012
comment
Фактический запрос, который я выполнил, содержал имя ограничения точно так же, как оно было возвращено в полученной ошибке. Я уверен, что в таблице не определен ключ. Единственными ограничениями являются объявления NOT NULL для нескольких полей. - person Ickster; 17.01.2012