9i新特性之——在線表格重定義研究5
2024-07-21 02:34:09
供稿:網(wǎng)友
9、所有的工作都預(yù)備完成,我們執(zhí)行重構(gòu)完成的過程,這個過程將執(zhí)行表的交換。 SQL> execute DBMS_REDEFINITION.FINISH_REDEF_TABLE('MYTEST','TEST', 'INT_TEST');
PL/SQL PRocedure sUCcessfully completed 我們還是往test表中插入數(shù)據(jù),將有什么結(jié)果呢?SQL> insert into test values(103,1);
1 row insertedSQL> select count(*) from test;
103SQL> select count(*) from int_test;
102SQL> select * from mlog$_test;
select * from mlog$_test
ORA-00942: table or view does not existSQL> select * from rupd$_test;
select * from rupd$_test
ORA-00942: table or view does not existSQL> select c from audit_test;
104 可以看到,這里的觸發(fā)器執(zhí)行的是以前在ini_test(中間表)上的觸發(fā)器。上一次是102,這次是104。 這里發(fā)生了一個很有趣的轉(zhuǎn)換,其實整個核心就是這里,Oracle這里完成了表test到int_test的表換名的工作,只是所有的約束、索引或觸發(fā)器名稱還是保持了原來的名稱SQL> select t.index_name,t.table_name from user_indexes t;
INT_TEST_PK TEST
PK_TEST_ID INT_TESTSQL> select t.trigger_name,t.table_name from user_triggers t;
TR_INT_TEST TEST
TR_TEST INT_TEST 我們檢查對象權(quán)限SQL> select * from USER_TAB_PRIVS_MADE;
SYSTEM INT_TEST MYTEST SELECT NO NO
SYSTEM INT_TEST MYTEST DELETE
SYSTEM TEST MYTEST SELECT NO NO
SYSTEM TEST MYTEST UPDATE
這里可以看到,對于所有數(shù)據(jù)字典中的這兩個名稱,其實是完成了一個表的名字對換的過程,所以對于原表的特性,我們必須在新表中給予相同的特性,這樣才能真正的轉(zhuǎn)換到新的表。 10、大功告成,我們可以刪除中間表,并且有可能的話,修改約束,索引,觸發(fā)器的名稱與原來一致,假如你認(rèn)為不重要,可以不予修改。SQL> drop table int_test;
Table dropped 假如是92以上版本,我們可以對索引,約束換名,但是以下版本,最好就是刪除重新建立了 假如運行了START_REDEF_TABLE 過程開始,我們就必須運行 dbms_redefinition.abort_redef_table('MYTEST','TEST','INT_TEST');來終止整個重構(gòu)過程,到這里,就算是完了。SQL> select object_name, object_type, status, object_id, data_object_id from user_objects order by 4;OBJECT_NAME OBJECT_TYPE STATUS OBJECT_ID DATA_OBJECT_ID
-------------------------------------------------------------------------------- ------------------ ------- --------- --------------
AUDIT_TEST TABLE VALID 33579 33579
TEST TABLE VALID 33582
TEST TABLE PARTITION VALID 33583 33589
TEST TABLE PARTITION VALID 33584 33590
TEST TABLE PARTITION VALID 33585 33591
TEST TABLE PARTITION VALID 33586 33592 6 rows selected 看到這里,你也應(yīng)該相信轉(zhuǎn)換已經(jīng)完成了吧,現(xiàn)在是分區(qū)表了。 總結(jié): 本文不想從大的框架上來說明問題,而是用一些例子來說明問題 這樣可能會更讓大家明白其中發(fā)生的一切。 這里盡量的模擬了實際可能會碰到的情況。 如約束,索引,觸發(fā)器,對象權(quán)限,這個在重新定義的時候需要注重什么,需要我們手工完成什么
外鍵約束這里沒有舉例說明,其實與普通約束一樣,只是在中間表上建立外鍵約束的時候,最好先禁止掉(DISABLE),等完成之后再打開。 其實主要過程就是完成了一個表的記錄的拷貝(通過快照),最后在數(shù)據(jù)字典中換名的工作。