2012-06-10 3 views
3

Я использую базу данных Oracle. Мы наблюдаем частые сбои в звонках на наш сервис. Когда я смотрел журналы, я вижу следующие исключения в таблицеИсключение нарушения ограничений ORA-00001

java.sql.BatchUpdateException: ORA-00001: уникальное ограничение (DBSCHEMA.IDX_CO_DETAILS) нарушено.

Я проверил индекс в таблице для имени индекса DBSCHEMA.IDX_CO_DETAILS.

В него не входила никакая колонка (INCLUDE_COLUMN - null). Как я могу узнать, для чего это ограничение? Это ограничение первичного ключа?

Мы используем спящий режим для ОРМ. Ниже приводится обратно след в контексте спящего

Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:94) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:266) 
    at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:167) 
    at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) 
    at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:50) 
    at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1027) 
    at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:365) 

ответ

10

A unique constraint навязывает, ну, уникальность. Он будет давать нули, в отличие от primary key constraint.

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

Вы можете узнать, какие ограничения указаны в таблице, выполнив следующий запрос на all_constraints. Ссылка декодирует столбец CONSTRAINT_TYPE, например P - это первичный ключ и U уникальный ключ.

select * 
    from all_constraints uc 
where uc.table_name = 'MY_TABLE' 
    and owner = 'DBSCHEMA' 

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

select uc.*, ucc.column_name, ucc.position 
    from all_constraints uc 
    join all_cons_columns ucc 
    on uc.owner = ucc.owner 
    and uc.table_name = ucc.table_name 
    and uc.constraint_name = ucc.constraint_name 
where uc.table_name = 'MY_TABLE' 
    and uc.owner = 'DBSCHEMA' 

Для любой запрос можно добавить дополнительное условие and constraint_name = 'IDX_CO_DETAILS', чтобы узнать подробности конкретное ограничение, которое, по-видимому, вызывает вашу проблему.


Ваш комментарий несколько удивителен по нескольким причинам. Даже появившееся в системе ограничение, например, такое, которое было определено в строке при создании таблицы без указания имени, должно отображаться. Кроме того, имя ограничения IDX... подразумевает, что это индекс.

Если вы запустите следующий запрос он должен сказать вам, если объект существует в базе данных:

select * 
    from all_objects 
where object_name = 'IDX_CO_DETAILS' 

Я бы ожидать, что OBJECT_TYPE возвращаемые этот запрос 'INDEX'.

После этого из следующего запроса будет возвращен каждый индекс с таким именем, тип индекса, связанная с ним таблица и владелец этой таблицы.

select * 
    from all_indexes 
where index_name = 'IDX_CO_DETAILS' 

Судя по вашей ошибке я бы дальше ожидать, что столбец UNIQUNESS возвращаемых этого запрос 'UNIQUE'.

Это поможет вам отследить объект.

Вы также можете использовать системный пакет dbms_metadata для отслеживания DDL объекта; будьте осторожны, он возвращает клоб.

select dbms_metadata.get_ddl('INDEX','IDX_CO_DETAILS', schema => 'DBSCHEMA') 
    from dual 

параметр schema не является обязательным.

+0

Я выполнил оба запроса. Я удалил владельца, поскольку он не возвращал строк. Ни одно из ограничений не имеет имени IDX_CO_DETAILS и нет уникальных ограничений ключа. Может ли это ограничение индекса, созданное oracle для первичного ключа? – Poorna

+0

@Shishir, я обновил свой ответ с дополнительной информацией. – Ben

+0

Да, она присутствует в таблице all_indexes. Но когда я запускаю последний запрос для dbms_metadata, я получил объект, который не нашел ошибку. У нас есть еще один внутренний инструмент для получения метаданных таблицы. Установлено, что IDX_CO_DETAILS состоит из трех столбцов. Поэтому при создании индекса он должен быть неудачным. Так что имеет смысл добавить ограничение на индекс, а не на таблицу ?. И в этом случае мы получаем исключение пакетного обновления JDBC. Можно ли этого избежать, если бы у нас было ограничение на таблицу, а не на Индекс? – Poorna