首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

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

2013-11-08 
10g在线重定义新特性——复制表相关对象Oracle在9i提供了在线重定义功能,利用这个功能可以在线修改表的逻辑

10g在线重定义新特性——复制表相关对象
Oracle在9i提供了在线重定义功能,利用这个功能可以在线修改表的逻辑结构或物理结构。不过在10g以前的版本,原表上的所有的索引、触发器、约束、统计信息和权限都需要在目标表上手工创建,不过从10g开始,Oracle提供了新的过程COPY_TABLE_DEPENDENTS,大大简化了在线重定义的步骤。9i中使用在线重定义的例子:http://yangtingkun.itpub.net/post/468/12962通过10g的COPY_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 ROW2 BEGIN3 NULL;4 END;5 /触发器已创建SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T')PL/SQL 过程已成功完成。SQL> CREATE TABLE T_INTER PARTITION BY HASH (ID)2 PARTITIONS 43 AS SELECT ROWNUM ID, A.* FROM USER_OBJECTS A WHERE 1 = 2;表已创建。初始表已经准备好了,准备改成的分区表也已经建立成功,下面开始在线重定义过程:SQL> SET SERVEROUT ON SIZE 1000000SQL> BEGIN2 DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T');3 END;4 /PL/SQL 过程已成功完成。SQL> BEGIN2 DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_INTER');3 END;4 /PL/SQL 过程已成功完成。SQL> VAR V_NUM NUMBERSQL> BEGIN2 DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(USER, 'T', 'T_INTER', 3 DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, :V_NUM, TRUE);4 END;5 /PL/SQL 过程已成功完成。SQL> PRINT V_NUMV_NUM----------0SQL> BEGIN2 DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_INTER');3 END;4 /PL/SQL 过程已成功完成。在线重定义操作已经完成,下面可以检查索引、约束、权限、触发器和统计信息是否已经被成功克隆:SQL> SELECT TABLE_NAME, INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME IN ('T', 'T_INTER');TABLE_NAME INDEX_NAME------------------------------ ------------------------------T SYS_C006293T IND_T_NAMET_INTER TMP$$_SYS_C0062930T_INTER TMP$$_IND_T_NAME0SQL> SELECT TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE2 FROM USER_CONSTRAINTS WHERE TABLE_NAME IN ('T', 'T_INTER');TABLE_NAME CONSTRAINT_NAME C------------------------------ ------------------------------ -T SYS_C006294 CT SYS_C006293 PT_INTER TMP$$_SYS_C0062930 PT_INTER TMP$$_SYS_C0062940 CSQL> SELECT TABLE_NAME, TRIGGER_NAME FROM USER_TRIGGERS WHERE TABLE_NAME IN ('T', 'T_INTER');TABLE_NAME TRIGGER_NAME------------------------------ ------------------------------T TRI_TT_INTER TMP$$_TRI_T0SQL> SELECT TABLE_NAME, PRIVILEGE FROM USER_TAB_PRIVS WHERE TABLE_NAME IN ('T', 'T_INTER');TABLE_NAME PRIVILEGE------------------------------ ----------------------------------------T_INTER INSERTT INSERTSQL> SELECT TABLE_NAME, NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME IN ('T', 'T_INTER');TABLE_NAME NUM_ROWS------------------------------ ----------T 34T_INTER 34SQL> SELECT TABLE_NAME, PARTITION_NAME FROM USER_TAB_PARTITIONS2 WHERE TABLE_NAME IN ('T', 'T_INTER');TABLE_NAME PARTITION_NAME------------------------------ ------------------------------T SYS_P41T SYS_P42T SYS_P43T SYS_P44SQL> DROP TABLE T_INTER PURGE;表已删除。所有的表相关对象已经创建成功,且在线重定义操作也顺利完成,最后删除中间表即可。

热点排行