[ОТВЕТИТЬ]
Опции темы
22.05.2013 15:49  
OlegON
В общем, на руки попала базенка с расползшимся индексом. Пока он расползся, в БД попали дубликаты и соответствующий constraint не включался. Как быть:
1. Создаем табличку exceptions, например, так
Код:
CREATE TABLE EXCEPTIONS (ROW_ID UROWID,
                         OWNER VARCHAR2(30),
                         TABLE_NAME VARCHAR2(30),
                         CONSTRAINT_NAME VARCHAR2(30));
можно обратиться к скрипту @?/rdbms/admin/utlexpt1.sql, но главное - в схеме того, кто пострадал, т.е. SUPERMAG в нашем случае.
2. Включаем невключаемый constraint, сбрасывая ошибки в созданную табличку
Код:
ALTER TABLE "SUPERMAG"."SMSPEC" ADD CONSTRAINT "SMCSPEC_DISPLAYPOS" UNIQUE ("DOCTYPE", "DOCID", "DISPLAYITEM") DEFERRABLE exceptions into exceptions;
оно вполне логично обломается
Цитата:
ERROR at line 1:
ORA-02299: cannot validate (SUPERMAG.SMCSPEC_DISPLAYPOS) - duplicate keys found
но при этом в
Код:
select row_id from supermag.exceptions;
будут записи о rowid записей, которые не влезают. Подчеркну, что там row_id, а не rowid надо искать :) Соответственно, самое простое и быстрое - это
Код:
delete from supermag.smspec where rowid in (select row_id from supermag.exceptions);
желательно при этом, чтобы база была в resrticted, а то наудалять можно много неожиданного, если параллельно кто-то что-то правит... Еще лучше - перед удалением посмотреть, что собираетесь грохнуть. Вот, как-то так... Склеил из кусочков, что сейчас делал.
 
 
Опции темы



Часовой пояс GMT +3, время: 21:24.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.