第一種方法
創(chuàng)新互聯(lián)公司是一家專(zhuān)注于成都網(wǎng)站建設(shè)、網(wǎng)站制作與策劃設(shè)計(jì),河?xùn)|網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:河?xùn)|等地區(qū)。河?xùn)|做網(wǎng)站價(jià)格咨詢:13518219792
使用主鍵id進(jìn)行重定義
--create user test identified by 1 account unlock;
--grant resource
--grant create any table, alter any table, drop any table, lock any table, select any table to test;
--<1> 創(chuàng)建測(cè)試表,以下使用在線重定義把表轉(zhuǎn)換為分區(qū)表,created為分區(qū)鍵, object_id 為主鍵
drop table test01 purge;
create table test01 as select * from dba_objects where object_id is not null;
alter table test01 add primary key(object_id);
select * from test01;
--<2> 創(chuàng)建分區(qū)表
create table test01_new
partition by range(created)
--INTERVAL(NUMTOYMINTERVAL(1,'month'))
interval(numtodsinterval(1,'day'))
store in (users)
(
partition p0 values less than (to_date('2008-01-01','yyyy-mm-dd') )
)
as select * from test01 where created is not null and 1!=1;
alter table test01_new add primary key(object_id);
--判斷目標(biāo)表是否可以使用主鍵進(jìn)行在線重定義,也可以使用rowid
exec dbms_redefinition.can_redef_table('TEST', 'TEST01', dbms_redefinition.cons_use_pk);
--把用戶test的test01表的定義改為test01_new表的定義
exec dbms_redefinition.start_redef_table('TEST', 'TEST01', 'TEST01_NEW');
--將中間表與原始表同步。(僅當(dāng)要對(duì)表 TEST01 進(jìn)行更新時(shí)才需要執(zhí)行該操作。)
exec dbms_redefinition.sync_interim_table('TEST', 'TEST01', 'TEST01_NEW');
--結(jié)束重定義表
exec dbms_redefinition.finish_redef_table('TEST', 'TEST01', 'TEST01_NEW');
--如果重定義失敗,解鎖
exec dbms_redefinition.abort_redef_table('TEST', 'TEST01', 'TEST01_NEW');
--優(yōu)點(diǎn):
--保證數(shù)據(jù)的一致性,在大部分時(shí)間內(nèi),表T都可以正常進(jìn)行DML操作。
--只在切換的瞬間鎖表,具有很高的可用性。這種方法具有很強(qiáng)的靈活性,對(duì)各種不同的需要都能滿足。
--而且,可以在切換前進(jìn)行相應(yīng)的授權(quán)并建立各種約束,可以做到切換完成后不再需要任何額外的管理操作。
--
--不足:實(shí)現(xiàn)上比上面兩種略顯復(fù)雜,適用于各種情況。
--然而,在線表格重定義也不是完美無(wú)缺的。下面列出了Oracle9i重定義過(guò)程的部分限制:
--你必須有足以維護(hù)兩份表格拷貝的空間。
--你不能更改主鍵欄。
--表格必須有主鍵。
--必須在同一個(gè)大綱中進(jìn)行表格重定義。
--在重定義操作完成之前,你不能對(duì)新加欄加以NOT NULL約束。
--表格不能包含LONG、BFILE以及用戶類(lèi)型(UDT)。
--不能重定義鏈表(clustered tables)。
--不能在SYS和SYSTEM大綱中重定義表格。
--不能用具體化視圖日志(materialized VIEW logs)來(lái)重定義表格;不能重定義含有具體化視圖的表格。
--不能在重定義過(guò)程中進(jìn)行橫向分集(horizontal subsetting)
第二種方法
使用rowid進(jìn)行重定義,一般在沒(méi)有主鍵的情況下使用
--其他如上
--判斷目標(biāo)表是否可以使用主鍵進(jìn)行在線重定義,也可以使用rowid
exec dbms_redefinition.can_redef_table('TEST', 'TEST01', dbms_redefinition.cons_use_rowid);
--把用戶test的test01表的定義改為test01_new表的定義
exec dbms_redefinition.start_redef_table('TEST', 'TEST01', 'TEST01_NEW',null,2);
--將中間表與原始表同步。(僅當(dāng)要對(duì)表 TEST01 進(jìn)行更新時(shí)才需要執(zhí)行該操作。)
exec dbms_redefinition.sync_interim_table('TEST', 'TEST01', 'TEST01_NEW');
--結(jié)束重定義表
exec dbms_redefinition.finish_redef_table('TEST', 'TEST01', 'TEST01_NEW');
--如果重定義失敗,解鎖
exec dbms_redefinition.abort_redef_table('TEST', 'TEST01', 'TEST01_NEW');
第三種方法
--<3>重命名表
alter table test01 rename to test01_bak;
alter table test01_bak rename to test01 ;
--<4>檢查是否缺漏數(shù)據(jù),補(bǔ)齊數(shù)據(jù)
select * from test01 t1
where up_time is not null --索引鍵不能有空數(shù)據(jù),否則插入失敗
and not exists (select 1 from test01 t2 where t1.id = t2.id )
insert into test01
select * from test01_bak t1
where up_time is not null --索引鍵不能有空數(shù)據(jù),否則插入失敗
and not exists (select 1 from test01 t2 where t1.id = t2.id )