При тестировании некоторых сценариев миграции с копией производственных данных (сценарии хорошо работают с данными разработки) я обнаружил любопытную ситуацию. Ограничение изменилось, поэтому я выполняю команды DROP + ADD:
ALTER TABLE A_DUP_CALLE
DROP CONSTRAINT A_DUP_CALLE_UK1;
ALTER TABLE A_DUP_CALLE
ADD CONSTRAINT A_DUP_CALLE_UK1 UNIQUE (
CONTROL_ID,
CALLE_AYTO_DUPL
)
ENABLE;
Команда DROP работала нормально, но команда ADD не удалась. Теперь я в замкнутом круге. Я не могу удалить ограничение, потому что оно не существует (первоначальное удаление сработало как ожидалось):
ORA-02443: Невозможно удалить ограничение - несуществующее ограничение
И я не могу создать его, потому что имя уже существует:
ORA-00955: имя уже используется существующим объектом
Я A_DUP_CALLE_UK1
ввожу в поле поиска разработчика SQL и ... вот оно! Владелец, имя таблицы, Tablescape ... все совпадает: это не другой объект с тем же именем, что это мое первоначальное ограничение. Таблица отображается в деталях ограничения, но ограничение не отображается в деталях таблицы.
Мои вопросы:
- Чем это объясняется?
- Как я могу гарантировать, что этого не произойдет, когда я произвожу реальное обновление на живом сервере?
(Сервер 10g XE, у меня недостаточно репутации для создания тега.)
источник
Ответы:
В предположении я бы сказал, что Мэриан прав, и это вызвано тем, что уникальный индекс и ограничение имеют одно и то же имя, например:
Обычно, когда вы добавляете уникальное ограничение, создается уникальный индекс с тем же именем, но индекс и ограничение - это не одно и то же. Посмотрите,
all_indexes
есть ли индекс с именем,A_DUP_CALLE_UK1
и попытайтесь выяснить, используется ли он чем-то другим, прежде чем вы его уроните!источник
exp
командой, содержитCREATE UNIQUE INDEX "A_DUP_CALLE_UK1" ...
оператор, которого нет в исходном наборе скриптов.Кажется очень странным
Вы можете запустить:
проверить, жалуется ли на какой объект Oracle. Затем вы можете запустить appROAIRATE DROP для этого.
Единственное, о чем я могу подумать, это полностью удалить таблицу,
DROP TABLE A_DUP_CALLE CASCADE CONSTRAINTS
чтобы избавиться от всего, что принадлежит этой таблице, а затем заново создать ее.Если таблица содержит ценные данные, вы можете сделать их резервную копию раньше:
После того, как вы воссоздали таблицу, вы можете сделать
восстановить данные.
источник
У меня была такая же проблема всего несколько минут назад ... и я нашел объяснение.
Создав Первичный Ключ, Oracle создает два объекта: ограничение и индекс, который управляет частью «УНИКАЛЬНАЯ».
При удалении ограничения индекс остается там, используя то же имя индекса, поэтому, если вы просто выполните
Вы будете отбрасывать только ограничение. Чтобы удалить индекс, вам нужно выполнить
Это должно сделать работу. Кроме того, вы можете выполнить обе эти команды одновременно с командой
источник
Ограничение первичного ключа идет с индексом. Вы отбрасываете ограничение, но не индекс. Проверьте:
и вы видите
OBJECT_TYPE
этоINDEX
.Так что сделайте оба:
источник
Сделай это
Это будет работать.
ОБРАЗ:
источник
ALTER TABLE A_DUP_CALLE DROP CONSTRAINT A_DUP_CALLE_UK1;
Relationship142
а другомуNOT NULL
Ограничению было дано имяSYS_C0015910
. Так чтоSYS_C0015910
был успешно удален с помощью простого запроса ALTER, ноRelationship142
нужны ДВОЙНЫЕ ЦИТАТЫalter table ... add constraint "Relationship143" ...
"Relationship143"
действительно другое имя, чемRELATIONSHIP143
. Но"RELATIONSHIP143"
иRELATIONSHIP143
являются идентичными"Relationship143"
по себе. Вероятно, это был один из ваших инструментов. Во всяком случае: как бы то ни было, ваш ответ просто неверен в контексте исходного вопроса.