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, время: 18:15.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.