熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

9i新特性之——在線表格重定義研究5

2013-11-13 16:07:40  來源: Oracle 

  所有的工作都准備完成我們執行重構完成的過程這個過程將執行表的交換

  SQL> execute DBMS_REDEFINITIONFINISH_REDEF_TABLE(MYTESTTEST INT_TEST);
PL/SQL procedure successfully completed

  我們還是往test表中插入數據將有什麼結果呢?

  SQL> insert into test values();
row inserted

  SQL> select count(*) from test;
       

  SQL> select count(*) from int_test;
       

  SQL> select * from mlog$_test;
select * from mlog$_test
ORA: table or view does not exist

  SQL> select * from rupd$_test;
select * from rupd$_test
ORA: table or view does not exist

  SQL> select c from audit_test;

  可以看到這裡的觸發器執行的是以前在ini_test(中間表)上的觸發器上一次是這次是

  這裡發生了一個很有趣的轉換其實整個核心就是這裡ORACLE這裡完成了表test到int_test的表換名的工作只是所有的約束索引或觸發器名稱還是保持了原來的名稱

  SQL> select tindex_namettable_name from user_indexes t;
INT_TEST_PK                    TEST
PK_TEST_ID                     INT_TEST

  SQL> select ttrigger_namettable_name from user_triggers t;
TR_INT_TEST                    TEST
TR_TEST                        INT_TEST

  我們檢查對象權限

  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

  這裡可以看到對於所有數據字典中的這兩個名稱其實是完成了一個表的名字對換的過程所以對於原表的特性我們必須在新表中給予相同的特性這樣才能真正的轉換到新的表

  大功告成我們可以刪除中間表並且有可能的話修改約束索引觸發器的名稱與原來一致如果你認為不重要可以不予修改

  SQL> drop table int_test;
Table dropped

  如果是以上版本我們可以對索引約束換名但是以下版本最好就是刪除重新建立了

  如果運行了START_REDEF_TABLE 過程開始我們就必須運行

  dbms_redefinitionabort_redef_table(MYTESTTESTINT_TEST);來終止整個重構過程到這裡就算是完了

  SQL> select object_name object_type status object_id data_object_id from user_objects order by ;

  OBJECT_NAME                                                                      OBJECT_TYPE        STATUS  OBJECT_ID DATA_OBJECT_ID

AUDIT_TEST   TABLE               VALID              
TEST          TABLE               VALID      
TEST          TABLE PARTITION    VALID                
TEST          TABLE PARTITION    VALID                
TEST          TABLE PARTITION    VALID                
TEST          TABLE PARTITION    VALID                

   rows selected

  看到這裡你也應該相信轉換已經完成了吧現在是分區表了

  總結

  本文不想從大的框架上來說明問題而是用一些例子來說明問題

  這樣可能會更讓大家明白其中發生的一切

  這裡盡量的模擬了實際可能會遇到的情況

  如約束索引觸發器對象權限這個在重新定義的時候需要注意什麼需要我們手工完成什麼

  外鍵約束這裡沒有舉例說明其實與普通約束一樣只是在中間表上建立外鍵約束的時候最好先禁止掉(DISABLE)等完成之後再打開

  其實主要過程就是完成了一個表的記錄的拷貝(通過快照)最後在數據字典中換名的工作


From:http://tw.wingwit.com/Article/program/Oracle/201311/17859.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.