我申请这个blog是为了督促自己,把自己平时的一些想法和思考结果保留下来。 本博客所有内容均为原创,如有转载请注明作者和出处

10g在线重定义新特性——复制表相关对象

上一篇 / 下一篇  2008-02-07 23:54:21 / 个人分类:ORACLE

Oracle9i提供了在线重定义功能,利用这个功能可以在线修改表的逻辑结构或物理结构。不过在10g以前的版本,原表上的所有的索引、触发器、约束、统计信息和权限都需要在目标表上手工创建,不过从10g开始,Oracle提供了新的过程COPY_TABLE_DEPENDENTS,大大简化了在线重定义的步骤。

9i中使用在线重定义的例子:http://yangtingkun.itpub.net/post/468/12962

 

通过10gCOPY_TABLE_DEPENDENTS过程,极大的简化了在线重定义所需要的手工处理部分,一个包含索引、约束、触发器、统计信息和授权的表的在线重定义过程,只需要下面的步骤就可以完成:

SQL> CREATE TABLE T AS SELECT ROWNUM ID, A.* FROM USER_OBJECTS A;

表已创建。

SQL> ALTER TABLE T ADD PRIMARY KEY (ID);

表已更改。

SQL> ALTER TABLE T ADD CHECK (ID > 0);

表已更改。

SQL> GRANT INSERT ON T TO SYSTEM;

授权成功。

SQL> CREATE INDEX IND_T_NAME ON T (OBJECT_NAME);

索引已创建。

SQL> CREATE OR REPLACE TRIGGER TRI_T BEFORE INSERT ON T FOR EACH ROWITPUB个人空间+F F dpf
  2  BEGINITPUB个人空间Np PS5~P
  3   NULL;
pz2QTM8t;[0  4  END;ITPUB个人空间`o*?;^ iXR
  5  /

触发器已创建

SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T')

PL/SQL过程已成功完成。

SQL> CREATE TABLE T_INTER PARTITION BY HASH (ID)ITPUB个人空间F6^b^"gN~6y
  2  PARTITIONS 4ITPUB个人空间4U]*r&f m;S8z/aw
  3  AS SELECT ROWNUM ID, A.* FROM USER_OBJECTS A WHERE 1 = 2;

表已创建。

初始表已经准备好了,准备改成的分区表也已经建立成功,下面开始在线重定义过程:

SQL> SET SERVEROUT ON SIZE 1000000
RV^V*Zb$i0SQL> BEGINITPUB个人空间 m^a;puF9Z
  2  DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T');ITPUB个人空间+BeB9^8w%\o6UV
  3  END;ITPUB个人空间7p kQ!Nm_/K+Ai
  4  /

PL/SQL过程已成功完成。

SQL> BEGINITPUB个人空间5| g r,H-^
  2  DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_INTER');
~ K [K%`4E0  3  END;
kR)Dy7gT&t0  4  /

PL/SQL过程已成功完成。

SQL> VAR V_NUM NUMBER
)G:Y3K e$]v*D D0SQL> BEGIN
B`E2C%\B8Fe&I+H0  2  DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(USER, 'T', 'T_INTER',
&l/V {`E4Y.u0  3   DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, :V_NUM, TRUE);
da*\Z\']F&}9U0  4  END;ITPUB个人空间8L)e"W*Nc-S#SS
  5  /

PL/SQL过程已成功完成。

SQL> PRINT V_NUM

     V_NUM
DqlW_3a/O0----------
d K-t^GI&I\0         0

SQL> BEGIN
F0pKt+~-Q0E_0  2  DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_INTER');
&h-N(Ou(Tyq3dw?6H0  3  END;ITPUB个人空间8Rp5fUm
  4  /

PL/SQL过程已成功完成。

在线重定义操作已经完成,下面可以检查索引、约束、权限、触发器和统计信息是否已经被成功克隆:

SQL> SELECT TABLE_NAME, INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     INDEX_NAME
0qLY/s6mVD h$us0------------------------------ ------------------------------
3bx&@#E?cY0T                              SYS_C006293ITPUB个人空间LZ4G'B1k
T                              IND_T_NAMEITPUB个人空间'}H N"Q{XTG kEK t
T_INTER                        TMP$$_SYS_C0062930
*[8`xME'o&H Q:~ }2n]0T_INTER                        TMP$$_IND_T_NAME0

SQL> SELECT TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPEITPUB个人空间 rl-r;V7IAW0iH:_a
  2  FROM USER_CONSTRAINTS WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     CONSTRAINT_NAME                C
tL/A{(Bj8w&T0------------------------------ ------------------------------ -ITPUB个人空间 z;Y"i B:ojc
T                              SYS_C006294                    CITPUB个人空间 {j LQJz\ U
T                              SYS_C006293                    P
9HEF6I%Y,B4h!]0T_INTER                        TMP$$_SYS_C0062930             P
ep}S.H0T_INTER                        TMP$$_SYS_C0062940             C

SQL> SELECT TABLE_NAME, TRIGGER_NAME FROM USER_TRIGGERS WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     TRIGGER_NAMEITPUB个人空间2V1nDrMV co)w
------------------------------ ------------------------------
3@R'a$N#bTB|c0T                              TRI_TITPUB个人空间 E U3m^2l1[
T_INTER                        TMP$$_TRI_T0

SQL> SELECT TABLE_NAME, PRIVILEGE FROM USER_TAB_PRIVS WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     PRIVILEGE
q5dWu'o?;X{0------------------------------ ----------------------------------------ITPUB个人空间2~LeGB f/?-q*MF
T_INTER                        INSERTITPUB个人空间EV9LV7]u
T                              INSERT

SQL> SELECT TABLE_NAME, NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                       NUM_ROWSITPUB个人空间D Y1bz2gk
------------------------------ ----------
*nn*\ M%g{sWKp0T                                      34ITPUB个人空间 R\;OuI7[IG x
T_INTER                                34

SQL> SELECT TABLE_NAME, PARTITION_NAME FROM USER_TAB_PARTITIONS
1f0dzFI0  2  WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     PARTITION_NAMEITPUB个人空间:K?/H;lw
------------------------------ ------------------------------ITPUB个人空间:Ch$I`|
T                              SYS_P41ITPUB个人空间3y&s5tf)[2z2Xt
T                              SYS_P42ITPUB个人空间*{]]eh.[L M
T                              SYS_P43
k~J.^2Q0T                              SYS_P44

SQL> DROP TABLE T_INTER PURGE;

表已删除。

所有的表相关对象已经创建成功,且在线重定义操作也顺利完成,最后删除中间表即可。

 


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar