ActiveRecord::StatementInvalid: OCIError: ORA-00955: имя уже используется существующим объектом

#ruby-on-rails #oracle #rails-activestorage

Вопрос:

Я получаю эту ошибку при запуске активной миграции хранилища.

 ActiveRecord::StatementInvalid: OCIError: ORA-00955: name is already used by an existing object: CREATE TABLE "ACTIVE_STORAGE_BLOBS" ("ID" NUMBER(38) NOT NULL PRIMARY KEY, "KEY" VARCHAR2(255) NOT NULL, "FILENAME" VARCHAR2(255) NOT NULL, "CONTENT_TYPE" VARCHAR2(255), "METADATA" CLOB, "BYTE_SIZE" NUMBER(19) NOT NULL, "CHECKSUM" VARCHAR2(255) NOT NULL, "CREATED_AT" TIMESTAMP NOT NULL)
 

Вот файл переноса активного хранилища, который используется для создания таблицы «Большой двоичный объект хранилища» и «Вложения активного хранилища».

 # This migration comes from active_storage (originally 20170806125915)
class CreateActiveStorageTables < ActiveRecord::Migration[5.2]
 def change
  create_table :active_storage_blobs do |t|
    t.string   :key,        null: false
    t.string   :filename,   null: false
    t.string   :content_type
    t.text     :metadata
    t.bigint   :byte_size,  null: false
    t.string   :checksum,   null: false
    t.datetime :created_at, null: false

    t.index [ :key ], unique: true
  end

  create_table :active_storage_attachments do |t|
    t.string     :name,     null: false
    t.references :record,   null: false, polymorphic: true, index: false
    t.references :blob,     null: false

    t.datetime :created_at, null: false

    t.index [ :record_type, :record_id, :name, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true
    t.foreign_key :active_storage_blobs, column: :blob_id
  end
 end
end
 

Конфигурация системы

 Rails version: 5.2.0
activerecord-oracle_enhanced-adapter: 5.2.0 
ruby-oci8: 2.2.6.1
Ruby version: 2.6.0
Oracle Database version: 10.2.0.1.0
 

Комментарии:

1. Oracle 10.2 ?? Вы используете относительно новую платформу Java с очень — очень старой версией Oracle. Это не имеет никакого отношения к ошибке-у вас есть объект с тем же именем в схеме , которую вы пытаетесь запустить с помощью инструкции create table, — но вам следует подумать об использовании более новой версии Oracle.

2. @RobertoHernandez, да, вы правы, что объект присутствует с тем же именем в схеме, но мой вопрос в том, почему это происходит снова, потому что я уже запустил все миграции. после обновления ruby с 5.1 до 5.2, а затем запуска Rspec, получите отсутствующую ошибку миграции, а затем запустите команду миграции, получившую эту ошибку.

3. вы уверены, что при повторном запуске миграции объекты будут удалены ? или что вы создаете два объекта с одинаковым именем ( например, таблицу и представление )

4. @RobertoHernandez Я создаю только один объект с таким именем, у меня есть только один файл для активного хранения

5. вы пытались удалить все таблицы в этой схеме перед запуском миграции ? Я предполагаю, что вы подключаетесь к базе данных с тем же пользователем, что и владелец схемы этих таблиц, верно ?

Ответ №1:

Ошибка говорит, что объект (не обязательно таблица), имя которого ACTIVE_STORAGE_BLOB уже существует в этой схеме.

Что делать? Сначала выясните, что это такое на самом деле, запросив

 select * from user_objects where object_name = 'ACTIVE_STORAGE_BLOB';
 

Затем решите, что делать:

  • может быть, вы ничего не сделаете и продолжите использовать существующий объект
  • возможно, вам придется переименовать таблицу, которую вы пытаетесь создать. Или,
  • возможно, вы удалите существующий объект, чтобы создать таблицу.

Это зависит от того, что вы узнаете.

Комментарии:

1. Я просто хочу знать, почему это произошло, но миграция уже началась.

2. Почему случилось что? Ошибка произошла из-за того, что объект с таким именем уже существует, и у вас не может быть двух объектов в одной схеме с одинаковым именем.

3. да, вы правы в том, что объект присутствует с тем же именем в схеме, но мой вопрос в том, почему это происходит снова, потому что я уже выполняю все миграции. после обновления ruby с 5.1 до 5.2, а затем запуска Rspec, получите отсутствующую ошибку миграции, а затем запустите команду миграции, получившую эту ошибку.

4. Извините, я ничего не знаю ни о Ruby, ни о Rspec, ни о «миграции», которую вы делаете. Я только что ответил на ваш вопрос об ORA-00955.