ONLINE TABLE REDEFINATION DBMS_REDEFINATION

Tablo sürekli kullanımda ve kesinti yapamıyoruz, O halde tablodaki tanımları değiştirebilmek, örneğin bir kolonun boyutunu değiştirmek veya Partition ekleme gibi bir işlemi Online olarak gerçekleştirebilmek için DBMS_REDEFINATION paketini kullanırız, bu işlemi yaparken tablomuzda Primary Key var ise onu kullanırız, PK yoksa Rownum kullanarak bu işlemi yapabiliriz.

Öncelikle Tablomuz Redefination için uygunmudur kontrolünü sağlayalım.

SQL> SET SERVEROUTPUT ON
begin
DBMS_REDEFINITION.CAN_REDEF_TABLE(
uname=>'SCOTT',
tname=>'TEST');
end;
/

ERROR at line 1:
ORA-12089: cannot online redefine table "SCOTT"."TEST" with no primary key
ORA-06512: at "SYS.DBMS_REDEFINITION", line 143
ORA-06512: at "SYS.DBMS_REDEFINITION", line 1635
ORA-06512: at line 2

Bu tabloda PK olmadığı için hata aldık, Çünkü işlem sırasında tabloya gelen transactionları yeni tabloya yansıtabilmesi için varsayılan olarak PK alan arayıyor varsa onu kullanıyor yoksa bize bu hatayı döndürüyor. O halde Rownum kullanmalıyız.

SQL> SET SERVEROUTPUT ON
begin
DBMS_REDEFINITION.CAN_REDEF_TABLE(
uname=>'SCOTT',
tname=>'TEST',
options_flag=>DBMS_REDEFINITION.cons_use_rowid);
end;
/

PL/SQL procedure successfully completed.

Rownum ile Table redefination yapabileceğimizi gördük o halde işleme başlayabiliriz. Değiştirmek istediğimiz tablo yapısını yeni bir tablo oluşturacağız ve bu tablo üzerinde eğer partition tanımalayacaksak bu tabloda tanımlıyoruz, kolon yapsında değişiklik yapmak istiyorsak yine bu yeni tabloda tanımlıyoruz yani yapmak istediğimiz değişiklikleri bu boş tablo üzerinde yapıyoruz, redefination işlemi bittiğinde bu tablo otomatik olarak ismi değiştirilecek, istediğimiz değişiklikler yapılmış bir şekilde yeni TEST tablomuz işlem sonucu oluşturuacaktır.

Dataları biz taşıyabiliriz aksi takdirde aşağıdaki işlem uzun sürebilir.

SET SERVEROUTPUT ON
 begin
 DBMS_REDEFINITION.start_redef_table( 
 uname=>'SCOTT',
 orig_table=>'TEST',
 int_table=>'TEST_OLD',
 options_flag=>DBMS_REDEFINITION.cons_use_rowid);
 end;
 /

Eğer PK varsa options_flag=>DBMS_REDEFINITION.cons_use_rowid kısmına gerek yok varsayılan olarak zaten PK kullanacaktır.

İki tabloyu senkron ediyoruz.

SQL>
SET SERVEROUTPUT ON
SET SERVEROUTPUT ON
begin
DBMS_REDEFINITION.SYNC_INTERIM_TABLE(
uname=>'SCOTT',
orig_table=>'TEST',
int_table=>'TEST_OLD');
end;
/

PL/SQL procedure successfully completed.

Indexleri, Constraintleri, trgger vs.. tablo özelliklerini ekliyoruz.

SQL>  SET SERVEROUTPUT ON
SQL>  DECLARE
  2   l_num_errors PLS_INTEGER;
  3   begin
  4   DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
  5   uname=>'SCOTT',
  6   orig_table=>'TEST',
  7   int_table=>'TEST_OLD',
  8   copy_indexes => DBMS_REDEFINITION.cons_orig_params,
  9   copy_triggers => TRUE,
 10   copy_constraints => TRUE,
 11   copy_privileges => TRUE,
 12   ignore_errors => FALSE,
 13   num_errors => l_num_errors);
 14   end;
 15   /
PL/SQL procedure successfully completed.

Ve son olarak Redefination işlemini bitiriyoruz.

SQL>  SET SERVEROUTPUT ON
begin
DBMS_REDEFINITION.FINISH_REDEF_TABLE(
uname=>'SCOTT',
orig_table=>'TEST',
int_table=>'TEST_OLD');
end;
/