為了解決這個問題,Oracle9i在其DBMS_REDEFINITION軟件包中引入了在線表格重定義功能。有了DBMS_REDEFINITION軟件包,你就可以:
1.拷貝表格(用CTAS)。
2.創建表格的快照(snapshot)。
3.把重定義表格的過程中所發生的變化進行排隊。
4.並用變化隊列來同步重定義後的表格。
這個特性對24/7Oracle數據庫來說非常重要,這是由於DBA現在可以在保持表格的可更新性的同時重新組織表格的結構。
我們以下面的腳本為例來說明重新組織表格結構的完整過程。
exec dbms_redefinition.abort_redef_table('PUBS','TITLES','TITLES2'); alter table titles add constraint pk_titles primary key (title_id); exec dbms_redefinition.can_redef_table('PUBS','TITLES'); create table titles2 as select * from titles; exec dbms_redefinition.start_redef_table('PUBS','TITLES','TITLES2',' title_id title_id,title title,type type, pub_id pub_id,price price,advance advance, royalty*1.1 royalty,ytd_sales ytd_sales,notes notes,pubdate pubdate'); exec dbms_redefinition.sync_interim_table('PUBS','TITLES','TITLES2'); exec dbms_redefinition.finish_redef_table('PUBS','TITLES','TITLES2'); drop table titles2; PRE>
如果重組織失敗,那麼你就必須采取特殊的步驟來讓它重新開始。由於重定義過程需要創建表格的快照,因此為了重新開始這一過程,你必須調用DBMS_REDEFINITION.ABORT_REDEF_TABLE來釋放快照。
DBMS_REDEFINITION.ABORT_REDEF_TABLE過程有三個參數,即大綱(schema)、原始表格(original table name)名稱以及持有表格名稱(holding table name)。它“出棧”並允許你開始重組織表格。
dbms_redefinition.abort_redef_table('PUBS','TITLES','TITLES2');>
然而,在線表格重定義也不是完美無缺的。下面列出了Oracle9i重定義過程的部分限制。
你必須有足以維護兩份表格拷貝的空間。
你不能更改主鍵欄。
表格必須有主鍵。
必須在同一個大綱中進行表格重定義。
在重定義操作完成之前,你不能對新加欄加以NOT NULL約束。
表格不能包含LONG、BFILE以及用戶類型(UDT)。
不能重定義鏈表(clustered tables)。
不能在SYS和SYSTEM大綱中重定義表格。
不能用具體化視圖日志(materialized vIEw logs)來重定義表格;不能重定義含有具體化視圖的表格。
不能在重定義過程中進行橫向分集(horizontal subsetting)。