Я занимаюсь обслуживанием на сайте Rails, который я унаследовал; это связано с базой данных Oracle, и у меня есть доступ как к разработке, так и к производственным установкам сайта (каждый со своей собственной БД Oracle). Я бегу в ошибку Oracle при попытке вставить данные на производственном участке, но не на сайте Dev:Rails: нарушение ограничений Oracle
ActiveRecord::StatementInvalid (OCIError: ORA-00001: unique constraint (DATABASE_NAME.PK_REGISTRATION_OWNERSHIP) violated: INSERT INTO registration_ownerships (updated_at, company_ownership_id, created_by, updated_by, registration_id, created_at) VALUES ('2006-05-04 16:30:47', 3, NULL, NULL, 2920, '2006-05-04 16:30:47')):
/usr/local/lib/ruby/gems/1.8/gems/activerecord-oracle-adapter-1.0.0.9250/lib/active_record/connection_adapters/oracle_adapter.rb:221:in `execute'
app/controllers/vendors_controller.rb:94:in `create'
Насколько я могу сказать (я использую Navicat как клиент Oracle), то Схема БД для сайта-разработчика идентична схеме БД. Я не эксперт Oracle; может ли кто-нибудь пролить свет на то, почему я получаю ошибку в одной установке, а не в другой?
Кстати, обе таблицы dev и production registration_ownerships заполнены большим количеством данных, включая дубликаты записей для country_ownership_id (управляемые индексом PK_REGISTRATION_OWNERSHIP). Пожалуйста, дайте мне знать, если вам нужна дополнительная информация для устранения неполадок. Мне жаль, что я уже не дал больше, но я просто не был уверен, какие детали будут полезны.
UPDATE: Я попытался удалить ограничение на производственном сервере, но это не повлияло; Я тоже не хотел отказываться от индекса, потому что я не уверен, каковы могут быть последствия, и я не хочу делать продукцию менее стабильной, чем она есть.
Любопытно, что я попытался выполнить вручную SQL, который выдавал ошибку, и Oracle принял инструкцию insert (хотя мне пришлось переносить даты в вызовы to_date() со строковыми литералами, чтобы обойти «ORA-01861: literal не соответствует строке формата "error". Что может быть здесь?
Спасибо за отзыв, Дейв. Я запустил select where company_ownership_id = 3 и registration_id = 2920 в производственной базе данных, и я не получил никаких записей. registration_id - это первый первичный ключ, а company_ownership_id - второй в registration_ownerships ... может быть, есть еще одна причина, по которой я получаю ошибку? Или я просто вас не понимаю? – justinbach
Ну, я догадался о компонентах первичного ключа на основе имен. Вы, вероятно, хотите посмотреть на определение PK_REGISTRATION_OWNERSHIP напрямую, чтобы узнать, что именно в базе данных думает уникальное значение. Является ли это единственным заявлением, которое терпит неудачу, или частью партии, где у вас могут быть дубликаты? – DaveE
Это единственная вставка, которая терпит неудачу, хотя она является частью набора запросов на вставку (регистрация_владений является частью модели регистрации). Ваша догадка была хорошей; определение PK_REGISTRATION_OWNERSHIP состоит из registration_id и company_ownership_id как поля и связано с таблицей registration_ownerships. Каждая из двух идентификаторов соответствует определенной последовательности. Может ли быть, что записи, используемые в таблице с этой комбинацией атрибутов, были удалены, но Oracle отметила, что определенная комбинация клавиш используется как «используется»? – justinbach