VS2004 |
Вопрос такой. База в режиме NOARCIVEMODE
Отрабатываю ситуацию, когда индексы находятся на выделенном диске и этот диск полностью сдох.
Что сделал:
1. смонтировал БД и используя команду ALTER DATABASE DATAFILE .... OFFLINE DROP отключил все файлы индексного пространства. Открыл базу.
2. Создал новое табличное индексное пространство. Пересоздал индексы
3. Удаляю старое табличное индексное пространство. Естественно получаю ошибку: ORA-02429: cannot drop index used for enforcement of unique/primary key потому что есть на таблицах ссылки на индексы.
Вопрос: каким образом все-таки удалить старое индексное пространство. |
По всей видимости надо переключить constraints на новые индексы.
Для примера:
SQL> create table test (id number,constraint test_pk primary key (id) using index (create index test_idx on test (id)));
Table created
SQL> alter table test modify constraint test_pk disable;
Table altered
SQL> drop index test_idx;
Index dropped
SQL> create index test_idx1 on test (id);
Index created
SQL> alter table test modify constraint test_pk using index test_idx1;
Table altered
SQL> alter table test modify constraint test_pk enable;
Table altered
SQL> select index_name from user_constraints where constraint_name='TEST_PK';
INDEX_NAME
------------------------------
TEST_IDX1
SQL> select banner from v$version;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
PL/SQL Release 9.2.0.7.0 - Production
CORE 9.2.0.7.0 Production
TNS for 32-bit Windows: Version 9.2.0.7.0 - Production
NLSRTL Version 9.2.0.7.0 - Production
SQL>
И еще такой вариант (для constraint, имена которых были сгенерированы системой):
SQL> drop table test;
Table dropped
SQL> create table test (id number primary key);
Table created
SQL> select constraint_name,index_name from user_constraints where table_name='TEST';
CONSTRAINT_NAME INDEX_NAME
------------------------------ ------------------------------
SYS_C003010 SYS_C003010
SQL> alter table test modify constraint SYS_C003010 disable;
Table altered
SQL> create index test_idx1 on test (id);
Index created
SQL> alter table test modify constraint SYS_C003010 using index test_idx1;
Table altered
SQL> alter table test modify constraint SYS_C003010 enable;
Table altered
SQL> select constraint_name,index_name from user_constraints where table_name='TEST';
CONSTRAINT_NAME INDEX_NAME
------------------------------ ------------------------------
SYS_C003010 TEST_IDX1
SQL>