当前位置:操作系统 > Unix/Linux >>

在线重定义表

在线重定义表
 
ORACLE数据库支持在线(不关库)修改表的各种物理属性和逻辑属性,包括分区、表空间、增加列、删除列、将表改为IOT表等等。
现在来简单测试一下这个强大的功能:
 
[sql] 
--实验环境  
  
14:23:42 SCOTT@orcl> select * from v$version;  
  
BANNER  
--------------------------------------------------------------------------------  
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production  
PL/SQL Release 11.2.0.1.0 - Production  
CORE    11.2.0.1.0      Production  
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production  
NLSRTL Version 11.2.0.1.0 - Production  
  
已选择5行。  
 
[sql] 
 --创建原始表  
  
14:07:36 SCOTT@orcl> create table admin_emp(  
14:07:54   2  empno number(4),ename varchar2(10),job varchar2(9),deptno number(4));  
  
表已创建。  
  
已用时间:  00: 00: 01.01  
 
我们来使用主键的方式进行重定义:
  在线重定义支持按键和按ROWID方式重定义。其中按键可以是按主键或有唯一索引的键
[sql] 
--给原始表加主键  
  
14:13:53 SCOTT@orcl> alter table admin_emp add primary key(empno);  
  
表已更改。  
  
14:14:17 SCOTT@orcl> desc admin_emp  
 名称                                                  是否为空? 类型  
 ----------------------------------------------------- -------- -------------  
  
 EMPNO                                                 NOT NULL NUMBER(4)  
 ENAME                                                          VARCHAR2(10)  
 JOB                                                            VARCHAR2(9)  
 DEPTNO                                                         NUMBER(4)  
[sql] 
--验证表是否能被在线重定义  
14:14:26 SCOTT@orcl> CONN /AS SYSDBA  
已连接。  
14:14:39 SYS@orcl> BEGIN  
14:14:43   2    DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT','admin_emp',  
14:14:43   3        DBMS_REDEFINITION.CONS_USE_PK);  
14:14:43   4  END;  
14:14:43   5  /  
  
PL/SQL 过程已成功完成。  
[sql] 
14:15:09 SYS@orcl> conn scott/tiger  
已连接。  
14:15:15 SCOTT@orcl> --创建中间表  
14:15:33 SCOTT@orcl> CREATE TABLE int_admin_emp  
14:16:44   2          (empno      NUMBER(5) PRIMARY KEY,  
14:16:44   3           ename      VARCHAR2(15) NOT NULL,  
14:16:44   4           job        VARCHAR2(10),  
14:16:44   5           mgr        NUMBER(5),  
14:16:44   6           hiredate   DATE DEFAULT (sysdate),  
14:16:44   7           sal        NUMBER(7,2),  
14:16:44   8           deptno     NUMBER(3) NOT NULL,  
14:16:44   9           bonus      NUMBER (7,2) DEFAULT(1000))  
14:16:44  10       PARTITION BY RANGE(empno)  
14:16:44  11         (PARTITION emp1000 VALUES LESS THAN (1000) TABLESPACE SCOTT_TBS,  
14:16:44  12          PARTITION emp2000 VALUES LESS THAN (2000) TABLESPACE USERS);  
  
表已创建。  
  
已用时间:  00: 00: 00.32  
14:16:46 SCOTT@orcl> --开始重定义处理  
14:17:04 SCOTT@orcl> conn /as sysdba  
已连接。  
14:17:25 SYS@orcl> BEGIN  
14:17:40   2    DBMS_REDEFINITION.START_REDEF_TABLE('SCOTT', 'admin_emp','int_admin_emp',  
14:17:40   3         'empno empno, ename ename, job job, deptno+10 deptno, 0 bonus',  
14:17:40   4          dbms_redefinition.cons_use_pk);  
14:17:40   5  END;  
14:17:40   6  /  
  
PL/SQL 过程已成功完成。  
  
已用时间:  00: 00: 10.84  
14:17:52 SYS@orcl> --复制依赖对象  
14:18:29 SYS@orcl> DECLARE  
14:18:29   2  num_errors PLS_INTEGER;  
14:18:29   3  BEGIN  
14:18:29   4    DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('SCOTT', 'admin_emp','int_admin_emp',  
14:18:29   5     DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);  
14:18:29   6  END;  
14:18:29   7  /  
  
PL/SQL 过程已成功完成。  
 
 
[sql] 
14:19:10 SYS@orcl> --同步中间表  
14:19:49 SYS@orcl> BEGIN  
14:19:49   2    DBMS_REDEFINITION.SYNC_INTERIM_TABLE('scott', 'admin_emp', 'int_admin_emp');  
14:19:49   3  END;  
14:19:49   4  /  
  
PL/SQL 过程已成功完成。  
  
已用时间:  00: 00: 00.06  
14:19:50 SYS@orcl> --完成重定义  
14:20:13 SYS@orcl> BEGIN  
14:20:13   2    DBMS_REDEFINITION.FINISH_REDEF_TABLE('scott', 'admin_emp', 'int_admin_emp');  
14:20:13   3  END;  
14:20:13   4  /  
  
PL/SQL 过程已成功完成。  
  
已用时间:  00: 00: 00.95  
14:20:17 SYS@orcl> conn scott/tiger  
已连接。  
--发现表结构已经改变 表在线重定义成功  
14:20:26 SCOTT@orcl> desc admin_emp  
 名称         &nb
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,