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

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

2013-11-13 16:00:37  來源: Oracle 

  創建我們需要重新定義的中間表這個是一個分區表以後我們將把原表的所有數據在線轉移到該表上來

  SQL>create table int_test
(a intb int)
partition by range(a)
(partition p values less than()
  partition p values less than()
  partition p values less than()
  partition p values less than());
Table created

  然後我們檢查所有對象所有對象共

  SQL> select object_nameobject_typestatusobject_iddata_object_id from user_objects;
AUDIT_TEST            TABLE              VALID                
INT_TEST               TABLE PARTITION    VALID                
INT_TEST               TABLE PARTITION    VALID                
INT_TEST               TABLE PARTITION    VALID                
INT_TEST               TABLE PARTITION    VALID                
INT_TEST               TABLE              VALID      
PK_TEST_ID             INDEX              VALID                
TEST                   TABLE              VALID                
TR_TEST                TRIGGER            VALID      
rows selected

  執行在線重新定義開始

  SQL> execute
DBMS_REDEFINITIONSTART_REDEF_TABLE(MYTESTTESTINT_TEST);

  begin SYSDBMS_REDEFINITIONSTART_REDEF_TABLE(MYTESTTESTINT_TEST); end;

  ORA: insufficient privileges
ORA: at SYSDBMS_REDEFINITION line
ORA: at SYSDBMS_REDEFINITION line
ORA: at line

  這裡存儲過程返回一個錯誤說沒有足夠的權限的確是這樣經查如果要執行這個存儲過程起碼需要如下權限

  * CREATE ANY TABLE
* ALTER ANY TABLE
* DROP ANY TABLE
* LOCK ANY TABLE
* SELECT ANY TABLE

  我們可以臨時授予DBA權限給用戶完之後取消掉或轉移到其他有權限的用戶執行這個操作

  SQL> CONNECT SYSTEM/CHEN
Connected to Oraclei Enterprise Edition Release
Connected as SYSTEM
SQL> execute SYSDBMS_REDEFINITIONSTART_REDEF_TABLE(MYTESTTESTINT_TEST);
PL/SQL procedure successfully completed

  這裡可以看到我們用system執行成功那麼這個過程到底兩個表執行了那些語句呢?我們可以通過如下的語句來驗證一下

  SQL> select sql_text from v$sqlarea where sql_text like %TEST%;

  SQL_TEXT

SELECT CURRENT$ACURRENT$B FROM (SELECT TESTA ATESTB B FROM
select * from MYTESTTEST
ALTER TRIGGER MYTESTTR_TEST COMPILE DEBUG
SELECT  /*+ NO_MERGE NO_MERGE(LL$) ROWID(MAS$) ORDERED USE_NL(MAS$) NO_INDEX(MAS
DELETE FROM MYTESTINT_TEST SNAP$ WHERE A = :
truncate table MYTESTINT_TEST purge snapshot log
delete from MYTESTMLOG$_TEST where snaptime$$ <= :
INSERT INTO MYTESTINT_TEST  (AB) VALUES (::)
select sql_text from v$sqlarea where sql_text like %TEST%
UPDATE MYTESTINT_TEST SET A = :B = : WHERE A = :
SELECT TESTA ATESTB B FROM MYTESTTEST TEST
begin dbms_redefinitioncan_redef_table(MYTEST TEST); end;
select count(*) from snap$ where (vname sowner) in ((TESTMYTEST))
comment on table MYTESTRUPD$_TEST is temporary updatable snapshot log
begin DBMS_REDEFINITIONSTART_REDEF_TABLE(MYTESTTESTINT_TEST); end;
comment on table MYTESTMLOG$_TEST is snapshot log for master table MYTEST
INSERT INTO MYTESTINT_TEST(AB) SELECT TESTATESTB FROM MYTE
INSERT /*+ APPEND */ INTO MYTESTINT_TEST(AB) SELECT TESTATEST
update MYTESTMLOG$_TEST set snaptime$$ = :  where snaptime$$ > to_date(
SELECT DISTINCT LOG$A FROM (SELECT MLOG$A FROM MYTESTMLOG$_TEST MLOG$

   rows selected

  以上的語句我不再解釋整個內部過程我也不再解釋只是需要大家明白其實這裡的主要需要了解的是就是把原表的數據給中間表復制了一份

  我們再檢查所有對象

  SQL> select object_name object_type status object_id data_object_id from user_objects order by ;
TEST                 TABLE              VALID                
AUDIT_TEST          TABLE              VALID                
TR_TEST              TRIGGER            VALID      
PK_TEST_ID           INDEX              VALID                
INT_TEST             TABLE              VALID      
INT_TEST             TABLE PARTITION    VALID                
INT_TEST             TABLE PARTITION    VALID                
INT_TEST             TABLE PARTITION    VALID                
INT_TEST             TABLE PARTITION    VALID                

  MLOG$_TEST          TABLE              VALID                
RUPD$_TEST          TABLE              VALID      
rows selected

  發現比以前多了兩個表對象

  這個就是該過程在執行後會產生兩個表

  一個是永久表MLOG$_EMP 這個是一個TEST快照日志記錄TEST的在此之後完成之前的DML語句

  另一個就是臨時表RUPD$_EMP

  我們檢查一下所有的表數據已便與下面的結果對比

  SQL> select count(*) from test;
       
SQL> select count(*) from MLOG$_test;
         
SQL> select count(*) from rupd$_test;
         
SQL> select count(*) from int_test;
         
    可以看到表的數據已經轉移過來

  SQL> select c from audit_test;
         
    這裡可以看到觸發器執行的還是原觸發器

  這裡給大家介紹兩個表的來源

  SQL> select masterlog_table from user_mview_logs;
TEST                           MLOG$_TEST

  SQL> select mview_namecontainer_name build_mode from user_mviews;
INT_TEST                       INT_TEST                       PREBUILT


From:http://tw.wingwit.com/Article/program/Oracle/201311/17663.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.