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,Tabloyu başka bir alanına taşımak 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 uygun mudur 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.
Eğer tablomuz büyük ve paralel işlem yapmamız gerekirse,
SQL> ALTER SESSION FORCE PARALLEL DML PARALLEL 8;
SQL> ALTER SESSION FORCE PARALLEL QUERY PARALLEL 8;
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 yapısı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şturacaktır.
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
l_num_errors PLS_INTEGER;
begin
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
uname=>'SCOTT',
orig_table=>'TEST',
int_table=>'TEST_OLD',
copy_indexes => DBMS_REDEFINITION.cons_orig_params,
copy_triggers => TRUE,
copy_constraints => TRUE,
copy_privileges => TRUE,
ignore_errors => FALSE,
num_errors => l_num_errors);
end;
/
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;
/
Redefination sırasına herhangi bir hata alınırsa işlemi iptal etmek için;
begin
DBMS_REDEFINITION.abort_redef_table('SCOTT','TEST','TEST_OLD');
end;
/
Bir yanıt yazın