当前位置:  数据库>oracle

通过在线重定义来增加大表列默认值

    来源: 互联网  发布时间:2017-06-03

    本文导语: 之前的文章讨论过11G中关于大表增加列的新特性  , 其中提到11G之前,可以通过在线重定义表的方式,来进行列的增加(且有默认值)。 在线重定义权限需求: grant create any table to 用户;grant alter any table to 用户;grant drop any table to ...

之前的文章讨论过11G中关于大表增加列的新特性  ,

其中提到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 contention

exec  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');

查看重定义以后的t

SQL> desc t;
 Name        Null?    Type
 ----------------------------------------- -------- ----------------------------
 OWNER          VARCHAR2(30)
 OBJECT_NAME        VARCHAR2(128)
 SUBOBJECT_NAME         VARCHAR2(30)
 OBJECT_ID      NOT NULL NUMBER
 .
 .
 .
 MRDAI          VARCHAR2(10)

已经添加列完成。

 

 


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户 100分相赠
  • 我的gaim只能通过"运行命令..."的方式启动,怎样增加图标?!
  • 问一下初级的问题,如果通过SSH增加一个系统用户
  • 如何不重编内核,而通过加载模块来增加系统调用?
  • turbolinux10中原来是英文操作系统,现在想变成支持中文,请问有什么好方法,如果能通过增加中文包来解决,请提供一点详细的资料。
  • JSP由浅入深(3)—— 通过表达式增加动态内容
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • applet可以不通过数字签名,通过设置IE直接在本地访问本地文件吗
  • php通过socket_bind()设置IP地址代码示例
  • 我使用.net编译通过,但是使用g++编译不能通过。总是提示我undefined reference to ~myclass()
  • 通过javascript库JQuery实现页面跳转功能代码
  • 紧急求救!能通过jdbc怎样连接sqlsever 然后通过 for xml 关键字得到xml流吗?
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • 我想我的网站屏蔽掉通过某些网站过来的访问,我想通过htaccess 文件来做,请大家帮帮我。
  • linux下通过crond实现自动执行程序
  • 如何通过INTERNET访问通过共项一条线路上网的局域网中的机器???
  • 通过docker commit命令保存对docker容器的修改
  • 为什么g++编译通过了,而gcc却编译通过不了???
  • 通过docker run命令运行新的docker镜像
  • Jbuilder第一次编译说缺包,引入通过!然后把原来引入的注释,又通过!上帝,救我!
  • 通过docker ps命令检查运行中的docker镜像
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • Session id实现通过Cookie来传输方法及代码参考
  • 工作站Redhat Linux7.2如何通过NT4.0 proxy代理服务器上网,我不能通过其验证!请高手指点思路和方法!
  • 通过docker search命令搜索可用docker镜像
  • linux下能通过ip地址ping通其它机器,通过计算机名ping不通怎么解决?
  • Python3通过request.urlopen实现Web网页图片下载
  • php通过socket_bind()设置IP地址代码示例 iis7站长之家


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,