基本步骤如下
第一步:利用dbms_redefinition.can_redef_table过程检查该表是否能被在线重定义。
第二步:创建一个与原表类似的空表结构,用于重定义该表,这里叫做是中间表
第三步:用dbms_redefinition.start_redef_table procedure定义重构开始
该过程可以输入如下参数信息
用户的名称
原表的名称
中间表的名称
需要同步改变的列的名称
这个过程将回自动执行如下操作:
1、插入所有行从原有表到中间表
2、创建MLOG$_EMP快照与快照日志,临时存储DML语句直到完成。
第四步:与原表一致,在中间表上面创建约束,索引,触发器
与原表一致(假如需要),中间表的对象权限被授予给别的对象
任何中间表上的外键约束将被禁止
第五步:用dbms_redefinition.finish_redef_table过程完成表的最终重定义
该过程将自动完成
应用快照日志中的DML到中间表
互换原表与中间表的名字,包括所有可能出现的数据字典
但是需要注重的是,并不对换约束,索引,触发器的名称,这些需要手工修改
第六步:删除中间表、
第七步:假如是920以上,可以利用ALTER TABLE ... RENAME CONSTRAINT ...语句来修改约束名称,假如以下版本,就只有删除并重建了,当然,假如约束名称并不重要,也就无所谓了
第八步:假如重组织失败,那么你就必须采取非凡的步骤来让它重新开始。由于重定义过程需要创建表格的快照,因此为了重新开始这一过程,你必须调用DBMS_REDEFINITION.ABORT_REDEF_TABLE来释放快照。