1. Проверяем, нет ли противопоказаний для переопределения таблицы
BEGIN DBMS_REDEFINITION.CAN_REDEF_TABLE( uname => 'MYUSER', tname => 'FILES', options_flag => DBMS_REDEFINITION.CONS_USE_ROWID); END;
2. Создаем промежуточную таблицу по мотивам имеющейся таблицы, которую нужно переопределить, с новыми параметрами
create table MYUSER.int_files tablespace tbs_new as select * from myuser.files where rownum = 0
Индексы и всякие констрейнты создавать не обязательно. Их потом можно все скопом перетащить.
alter table myuser.INT_FILES add constraint INT_FILES_UK1 unique (FILE_NAME, FILE_VERSION) using index tablespace tbs_new
3. Выполняем действия, в результате которых параметры исходной таблицы поменяются (в данном случае, она переползет в другой тэйблспейс).
Во время этой операции таблица практически все время будет доступна для DML, кроме короткой блокировки.
BEGIN DBMS_REDEFINITION.START_REDEF_TABLE( uname => 'MYUSER', orig_table => 'FILES', int_table => 'INT_FILES', col_mapping => NULL, options_flag => DBMS_REDEFINITION.CONS_USE_ROWID); END;
BEGIN DBMS_REDEFINITION.SYNC_INTERIM_TABLE( uname => 'MYUSER', orig_table => 'FILES', int_table => 'INT_FILES'); END;
BEGIN DBMS_REDEFINITION.FINISH_REDEF_TABLE( uname => 'MYUSER', orig_table => 'FILES', int_table => 'INT_FILES'); END;
4. Промежуточную таблицу можно удалить.
|