oracle数据库在线表格重定义功能简介 在oracle9i 出现之前,你只能通过导出和导入的方式进行重定义,因此表格的重定义的过程是一个离线的过程。甚至在线的变化 也会导致独占性死锁,这就需要在dll 完成之前防止所有的dml的运行 为了解决这个问题,oracle9i 在其dbms_redefinition 软件保重引入了在线表格重定义功能。有了DBMS_REDEFINITION 软件包,你就可以: 1.拷贝表格 2.创建表格的快照 3.把重定义表格的过程中所发生的变化进行排队 4.并用变化队列来同步重定义表格后的表格。 这个特性对24/70oracle数据库来说非常重要,这是由于DBA现在可以在保持表格的可更新性的同时重新组织表格结构。 我们一下面的脚本为例来说明表格结构的完整过程 exec dbms_redefinitin.abort_redef_table ('pubs','titles','titles2'); alter table titles add constraint pk_titles primary key(title_id); exec dbms_redefinition.can_redef_table('pubs','titles'); create table titles2 as select * from titles; exec dbms_redefinition.start_redef_table('pubs','titles','titles2','title_id title_id,title title ,type type,pub_id pub_id,price price,advance advance,royalty*1.1 royalty,ytd_sales, notes notes, pubdate pubdate'); exec dbms_redefinition.sync_interim_table('pubs','titles','titles2'); exec dbms_redefinition.finish_redef_table('pubs','titles','titles2'); drop table titles2; 如果重组织失败,那么你就必须采取特殊的步骤来让他重新开始。由于重新定义过程需要创建表格的快照,因袭为了重组织新开始这一过程,你必须调用dbms_redefinition.abort_redef_table 来释放快照。 dbms_redefinition.abort_table 过程有三个参数,即大纲(sch ema) 原始表格(origin al table name ) 名称以及持有表格名称(hol ding table name) 它出栈 并允许你开始重表格。
dbms_redefinition.abort_redef_table('pub','titles','titles2'); 然而,在线表格重定义也不是完美无缺,下面列出了oracle9i重定义过程的部分限制 你必须有足以维护两份表格拷贝的空间 你不能更改主键栏 表格必须有主键 必须在同一个大纲中进行表格重定义 在重定义操作完成之前,你不能对新加栏加以not null约束 表格不能包含long bfile 以及用户类型(udt) 不能重定义链表 不能在sys和system 大纲中重定义表格 不能用具体化视图日志(materialized view logs) 来重定义表格;不能重定义含有具体化视图的表格 不能在重定义过程中进行横向分集