Welcome 微信登录

首页 / 数据库 / MySQL / 通过在线重定义来增加大表列默认值

之前的文章讨论过11G中关于大表增加列的新特性 http://www.linuxidc.com/Linux/2014-04/99547.htm ,其中提到11G之前,可以通过在线重定义表的方式,来进行列的增加(且有默认值)。在线重定义权限需求:grant create any table to 用户;
grant alter any table to 用户;
grant drop any table to 用户;
grant lock any table to 用户;
grant select any table to 用户;
grant create any trigger to 用户;
grant create any index to 用户;1.SQL获取原始表的DDL可通过如下设置,将storage 子句去除,也可以不去执行begin
    Dbms_Metadata.Set_Transform_Param(Dbms_Metadata.Session_Transform,
                                    "SQLTERMINATOR",
                                    True);
  Dbms_Metadata.Set_Transform_Param(Dbms_Metadata.Session_Transform,
                                    "STORAGE",
                                    False);
end;获取原始表的DDL语句(这里例子为T)set pagesize 5000
set long 50000
Select Dbms_Metadata.Get_Ddl(Object_Type => "TABLE", Name => "T") from dual
union all
select Dbms_Metadata.Get_Dependent_Ddl(Object_Type => "CONSTRAINT",Base_Object_Name => "T")  from dual
union all
select Dbms_Metadata.Get_Dependent_Ddl(Object_Type => "INDEX",Base_Object_Name => "T") from dual
union all
select Dbms_Metadata.Get_Dependent_Ddl("OBJECT_GRANT", "T", "SCOTT")  from dual;2.将获取的语句中的 表名T,替换为T2,之后建立。
 
3.给t2表 增加字段(带有默认值)alter table t2 add MrDai varchar2(10) default "MrDai";4.检查一下能否T表能否进行重定义,如果执行成功,则表示可以,否则将会报错显示为什么不可以exec Dbms_Redefinition.Can_Redef_Table(USER, "T");5.开始重定义注意:如原始表有未提交的事物,该过程会一直在等待,等待事件为enq: TX - row lock contentionexec  dbms_redefinition.start_redef_table(uname => USER,orig_table => "T",int_table => "T2",options_flag => DBMS_REDEFINITION.cons_use_pk);6.完成重定义exec dbms_redefinition.finish_redef_table(uname=>USER,orig_table=>"T",int_table=>"T2");查看重定义以后的tSQL> desc t;
 Name        Null?    Type
 ----------------------------------------- -------- ----------------------------
 OWNER          VARCHAR2(30)
 OBJECT_NAME       VARCHAR2(128)
 SUBOBJECT_NAME         VARCHAR2(30)
 OBJECT_ID     NOT NULL NUMBER
 .
 .
 .
 MRDAI          VARCHAR2(10)已经添加列完成。  更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12Oracle 11g增加列,并带默认值的新特性因/etc/fstab错误导致系统不能启动故障解决办法相关资讯      在线重定义  增加大表列默认值 
  • Oracle在线重定义  (11/27/2015 09:11:37)
本文评论 查看全部评论 (0)
表情: 姓名: 字数