资源描述:
《oracle数据库通过在线重定义的方法新增字段详解》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Oracle数据库操作中,假如在原始表TB_HXL_USER上新增字段remark01,默认值为'A',但是由于该表的数据量比较大,直接在原表上新增字段,执行的时间特别长,最后还报出了undo空间不足的问题。而且在新增字段的过程中,其他用户还不能访问该表,出现的等待事件是librarycachelock。下面试着通过在线重定义的方法新增字段,能够避免undo空间不足以及其他用户不能访问该表的情况。1.使用如下SQL获取原始表的DDL设置分隔符号以及去掉表DDL中的storage属性:1.begin 2. 3.Dbms
2、_Metadata.Set_Transform_Param(Dbms_Metadata.Session_Transform, 4. 5.'SQLTERMINATOR', 6. 7.True); 8. 9.Dbms_Metadata.Set_Transform_Param(Dbms_Metadata.Session_Transform, 10. 11.'STORAGE', 12. 13.False); 14. 15.end; 提取表,索引,约束以及权限的语句。1.Select Dbms_Metadata.Get_Ddl
3、(Object_Type => 'TABLE', Name => 'TB_HXL_USER')
4、
5、 2. 3.Dbms_Metadata.Get_Dependent_Ddl(Object_Type => 'INDEX', 4. 5.Base_Object_Name => 'TB_HXL_USER')
6、
7、 6. 7.Dbms_Metadata.Get_Dependent_Ddl(Object_Type => 'CONSTRAINT', 8. 9.Base_Object_Name => 'TB_HXL_USER')
8、
9、
10、 10. 11.Dbms_Metadata.Get_Dependent_Ddl('OBJECT_GRANT', 'TB_HXL_USER', 'HXL') 12. 13.From Dual 2.将步骤1SQL中的表名TB_HXL_USER替换为TB_HXL_USER_MID创建中间表3.中间表新增字段remark011.alter table TB_HXL_USER_MID add remark01 varchar2(10) default 'A'; 4.检查能否进行重定义,过程执行成功即说明可以重定义1.Beg
11、in 2. 3.Dbms_Redefinition.Can_Redef_Table(USER, 'TB_HXL_USER'); 4. 5.End; 5.开始重定义表注意:如原始表有未提交的事物,该过程会一直在等待,等待事件为enq:TX-rowlockcontention。不能执行start_redef_table的情况下,需要将如下权限赋予用户。1.grant create any table to hxl; 2. 3.grant alter any table to hxl; 4. 5.grant drop an
12、y table to hxl; 6. 7.grant lock any table to hxl; 8. 9.grant select any table to hxl; 10. 11.grant create any trigger to hxl; 12. 13.grant create any index to hxl; 运行start_redef_table过程1.BEGIN 2. 3.dbms_redefinition.start_redef_table( 4. 5.uname => USER, 6. 7.o
13、rig_table => 'TB_HXL_USER', 8. 9.int_table => 'TB_HXL_USER_MID', 10. 11.options_flag => DBMS_REDEFINITION.cons_use_pk); 如果有主键则是options_flag=>DBMS_REDEFINITION.cons_use_pk,如果没有1.DBMS_REDEFINITION.cons_use_rowid 2.END; 6.开始同步中间表1.BEGIN 2. 3.dbms_redefinition.sync
14、_interim_table( 4. 5.uname => USER, 6. 7.orig_table => 'TB_HXL_USER', 8. 9.int_table => 'TB_HXL_USER_MID'); 10. 11.END; 7.完成同步注意:如原始表有未提交的事物,该过程会一直在等待1.BEGIN 2. 3.dbms_redef