9i的在线重定义存在一个问题,执行完在线重定义后,表的名称虽然保持不变,但是索引、约束、触发器等关联对象的名称会发生变化,有时候这会带来一定的问题,而要在事后手工修改,会比较麻烦。

10g的在线重定义解决这个问题。如果对象是利用COPY_TABLE_DEPENDENTS创建的,那么这些关联的对象在重定义操作完成后,自动改为原始的名称。如果是手工创建的关联对象,则可以利用REGISTER_DEPENDENT_OBJECT过程,所有执行了REGISTER_DEPENDENT_OBJECT过程的关联对象,都会在重定义操作完成后自动重命名。

这篇文章来看REGISTER_DEPENDENT_OBJECT的例子。

上一篇介绍了10g中COPY_TABLE_DEPENDENTS的例子,这篇看看手工创建关联对象,然后使用REGISTER_DEPENDENT_OBJECT的例子。

首先还是先看9i的例子:

SQL> SELECT * FROM V$VERSION;

BANNER

----------------------------------------------------------------

Oracle9i Enterprise Edition Release9.2.0.4.0 -Production

PL/SQL Release 9.2.0.4.0 - Production

CORE    9.2.0.3.0       Production

TNS for 32-bit Windows: Version 9.2.0.4.0 - Production

NLSRTL Version 9.2.0.4.0 - Production

SQL> CREATE TABLE T AS SELECT ROWNUM ID, A.* FROM USER_OBJECTS A;

表已创建。

SQL> ALTER TABLE T ADD CONSTRAINT PK_T PRIMARY KEY (ID);

表已更改。

SQL> ALTER TABLE T ADD CHECK (ID > 0);

表已更改。

SQL> CREATE INDEX IND_T_NAME ON T (OBJECT_NAME);

索引已创建。

SQL> CREATE OR REPLACE TRIGGER TRI_T

2  BEFORE INSERT ON T

3  FOR EACH ROW

4  BEGIN

5  NULL;

6  END;

7  /

触发器已创建

SQL> CREATE TABLE T_INTER

2  PARTITION BY HASH (ID)

3  PARTITIONS 4

4  AS SELECT ROWNUM ID, A.*

5  FROM USER_OBJECTS A

6  WHERE 1 = 2;

表已创建。

SQL> ALTER TABLE T_INTER ADD CONSTRAINT PK_T_INTER PRIMARY KEY (ID);

表已更改。

SQL> ALTER TABLE T_INTER ADD CHECK (ID > 0) DISABLE;

表已更改。

SQL> CREATE INDEX IND_T_INTER_NAME ON T_INTER (OBJECT_NAME);

索引已创建。

SQL> CREATE OR REPLACE TRIGGER TRI_T_INTER

2  BEFORE INSERT ON T_INTER

3  FOR EACH ROW

4  BEGIN

5  NULL;

6  END;

7  /

触发器已创建

SQL> SET SERVEROUT ON SIZE 1000000

SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T')

PL/SQL过程已成功完成。

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_INTER')

PL/SQL过程已成功完成。

SQL> SELECT TABLE_NAME, INDEX_NAME

2  FROM USER_INDEXES

3  WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     INDEX_NAME

------------------------------ ------------------------------

T_INTER                        IND_T_INTER_NAME

T                              IND_T_NAME

T                              PK_T

T_INTER                        PK_T_INTER

SQL> SELECT TABLE_NAME, CONSTRAINT_NAME

2  FROM USER_CONSTRAINTS

3  WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     CONSTRAINT_NAME

------------------------------ ------------------------------

T                              PK_T

T                              SYS_C002990

T_INTER                        PK_T_INTER

T_INTER                        SYS_C002992

SQL> SELECT TABLE_NAME, TRIGGER_NAME

2  FROM USER_TRIGGERS

3  WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     TRIGGER_NAME

------------------------------ ------------------------------

T                              TRI_T

T_INTER                        TRI_T_INTER

SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_INTER')

PL/SQL过程已成功完成。

SQL> SELECT TABLE_NAME, INDEX_NAME

2  FROM USER_INDEXES

3  WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     INDEX_NAME

------------------------------ ------------------------------

T                              IND_T_INTER_NAME

T_INTER                        IND_T_NAME

T_INTER                        PK_T

T                              PK_T_INTER

SQL> SELECT TABLE_NAME, CONSTRAINT_NAME

2  FROM USER_CONSTRAINTS

3  WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     CONSTRAINT_NAME

------------------------------ ------------------------------

T                              PK_T_INTER

T                              SYS_C002992

T_INTER                        PK_T

T_INTER                        SYS_C002990

SQL> SELECT TABLE_NAME, TRIGGER_NAME

2  FROM USER_TRIGGERS

3  WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     TRIGGER_NAME

------------------------------ ------------------------------

T_INTER                        TRI_T

T                              TRI_T_INTER

SQL> DROP TABLE T_INTER;

表已删除。

可以看到,执行完重定义操作后,所有的关联对象的名称都与原来不一样了。

再看看10g使用REGISTER_DEPENDENT_OBJECT的例子,执行完在线重定义,新生成的表对应的这些对象的名称是否能与原表一致:

SQL> SELECT * FROM V$VERSION;

BANNER

----------------------------------------------------------------

Oracle Database10gEnterprise Edition Release10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE    10.2.0.1.0      Production

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production

SQL> CREATE TABLE T AS SELECT ROWNUM ID, A.* FROM USER_OBJECTS A;

表已创建。

SQL> ALTER TABLE T ADD CONSTRAINT PK_T PRIMARY KEY (ID);

表已更改。

SQL> ALTER TABLE T ADD CHECK (ID > 0);

表已更改。

SQL> CREATE INDEX IND_T_NAME ON T (OBJECT_NAME);

索引已创建。

SQL> CREATE OR REPLACE TRIGGER TRI_T

2  BEFORE INSERT ON T

3  FOR EACH ROW

4  BEGIN

5  NULL;

6  END;

7  /

触发器已创建

SQL> CREATE TABLE T_INTER

2  PARTITION BY HASH (ID)

3  PARTITIONS 4

4  AS SELECT ROWNUM ID, A.*

5  FROM USER_OBJECTS A

6  WHERE 1 = 2;

表已创建。

SQL> ALTER TABLE T_INTER ADD CONSTRAINT PK_T_INTER PRIMARY KEY (ID);

表已更改。

SQL> ALTER TABLE T_INTER ADD CHECK (ID > 0) DISABLE;

表已更改。

SQL> CREATE INDEX IND_T_INTER_NAME ON T_INTER (OBJECT_NAME);

索引已创建。

SQL> CREATE OR REPLACE TRIGGER TRI_T_INTER

2  BEFORE INSERT ON T_INTER

3  FOR EACH ROW

4  BEGIN

5  NULL;

6  END;

7  /

触发器已创建

SQL> SET SERVEROUT ON SIZE 1000000

SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T')

PL/SQL过程已成功完成。

SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_INTER')

PL/SQL过程已成功完成。

SQL> SELECT TABLE_NAME, INDEX_NAME

2  FROM USER_INDEXES

3  WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     INDEX_NAME

------------------------------ ------------------------------

T_INTER                        PK_T_INTER

T_INTER                        IND_T_INTER_NAME

T                              PK_T

T                              IND_T_NAME

SQL> SELECT TABLE_NAME, CONSTRAINT_NAME

2  FROM USER_CONSTRAINTS

3  WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     CONSTRAINT_NAME

------------------------------ ------------------------------

T                              PK_T

T                              SYS_C0011923

T_INTER                        PK_T_INTER

T_INTER                        SYS_C0011925

SQL> SELECT TABLE_NAME, TRIGGER_NAME

2  FROM USER_TRIGGERS

3  WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     TRIGGER_NAME

------------------------------ ------------------------------

T_INTER                        TRI_T_INTER

T                              TRI_T

SQL> BEGIN

2   DBMS_REDEFINITION.REGISTER_DEPENDENT_OBJECT(USER, 'T', 'T_INTER',

3    DBMS_REDEFINITION.CONS_INDEX, USER, 'IND_T_NAME', 'IND_T_INTER_NAME');

4  END;

5  /

PL/SQL过程已成功完成。

SQL> BEGIN

2   DBMS_REDEFINITION.REGISTER_DEPENDENT_OBJECT(USER, 'T', 'T_INTER',

3    DBMS_REDEFINITION.CONS_INDEX, USER, 'PK_T', 'PK_T_INTER');

4  END;

5  /

PL/SQL过程已成功完成。

SQL> BEGIN

2   DBMS_REDEFINITION.REGISTER_DEPENDENT_OBJECT(USER, 'T', 'T_INTER',

3    DBMS_REDEFINITION.CONS_CONSTRAINT, USER, 'SYS_C0011923', 'SYS_C0011925');

4  END;

5  /

PL/SQL过程已成功完成。

SQL> BEGIN

2   DBMS_REDEFINITION.REGISTER_DEPENDENT_OBJECT(USER, 'T', 'T_INTER',

3    DBMS_REDEFINITION.CONS_TRIGGER, USER, 'TRI_T', 'TRI_T_INTER');

4  END;

5  /

PL/SQL过程已成功完成。

SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_INTER')

PL/SQL过程已成功完成。

在线重定义操作已经完成,再次检查表上的索引、约束和触发器的名称:

SQL> SELECT TABLE_NAME, INDEX_NAME

2  FROM USER_INDEXES

3  WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     INDEX_NAME

------------------------------ ------------------------------

T                              PK_T

T                              IND_T_NAME

T_INTER                        PK_T_INTER

T_INTER                        IND_T_INTER_NAME

SQL> SELECT TABLE_NAME, CONSTRAINT_NAME

2  FROM USER_CONSTRAINTS

3  WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     CONSTRAINT_NAME

------------------------------ ------------------------------

T                              PK_T_INTER

T                              SYS_C0011923

T_INTER                        PK_T

T_INTER                        SYS_C0011925

SQL> SELECT TABLE_NAME, TRIGGER_NAME

2  FROM USER_TRIGGERS

3  WHERE TABLE_NAME IN ('T', 'T_INTER');

TABLE_NAME                     TRIGGER_NAME

------------------------------ ------------------------------

T                              TRI_T

T_INTER                        TRI_T_INTER

SQL> DROP TABLE T_INTER PURGE;

表已删除。

可以看到,如果时手工添加关联对象,也可以利用REGISTER_DEPENDENT_OBJECT过程来实现重定义后关联对象的重命名。实际上,如果使用COPY_TABLE_DEPENDENTS过程,Oracle会自动为所有的关联对象执行REGISTER_DEPENDENT_OBJECT过程。

两种方法都能实现同样的功能,而且也是各有各的优缺点。COPY_TABLE_DEPENDENTS过程更加方便,不容易出现遗漏。比如在这个例子中,执行REGISTER_DEPENDENT_OBJECT过程是就只注册了主键的索引,而没有注册主键的约束。因此最后主键对应的索引名称没有改变,而主键对应的约束名称则发生了变化。

而REGISTER_DEPENDENT_OBJECT过程最大的优势就是所有的操作自主权完全在用户手中,可以选择根据需要对指定的对象执行注册,具有很强的定制性。Oracle还提供了UNREGISTER_DEPENDENT_OBJECT过程来取消对象的注册。

oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html

转载于:https://blog.51cto.com/19880614/1200654

oracle 10g在线重定义新特性——关联对象自动重命名(二)相关推荐

  1. 深入解析 | Oracle Database 20c 十大新特性一览

    在2020年2月14日,Oracle 正式宣布在 Oracle Cloud 发布 Database 20c 的预览版,同时发布了所有的官方文档. 为了和大家及时分享关于 Oracle 20c 引人瞩目 ...

  2. atitit.Oracle 9 10 11 12新特性attilax总结

    atitit.Oracle 9  10 11  12新特性 1. ORACLE 11G新特性 1 1.1. oracle11G新特性 1 1.2. 审计 1 1.3. 1.   审计简介 1 1.4. ...

  3. 今天聊聊Oracle Database 21c 十“小”新特性

    墨墨导读:Oracle Database 21c 已经在云上提供,线下版本将于2021年上半年提供,这标志着 Oracle 进入了下一个版本周期的创新发布. 关于 Oracle 21c 其实就相当于 ...

  4. 嘉年华回顾丨 杨长老带你解密 Oracle 19c 和 20c 的新特性

    2020年数据技术嘉年华还有两周多的时间,相信大家期待值也越来越高.数据技术嘉年华组委会在此精心为大家准备了"嘉年华回顾",挑选往届大会中热门的演讲.小编带大家回顾往届的高光时刻! ...

  5. 开工大吉:Oracle 18c已经发布及新特性介绍

    在2018的新年(据2月16日文章),Oracle宣布Database 18c已经发布,但是仍然是首先在Oracle Cloud上一体机环境发布出来.所以要等到常规版本的公开提供,还有一段时间要等. ...

  6. Oracle 11.2.0.2新特性——用户重命名(Rename User)

    11.2.0.2里新增了一个很有意思的新特性--用户重命名(Rename User),以前俺们都是Rename datafile呀,tablespace呀,Index呀,抑或是constraint之类 ...

  7. Oracle Database 21c 十大新特性一览 - New Features

    墨墨导读:Oracle考虑到2020年我们的客户将面临前所未有的经济和业务中断.我们决定不将Database 20c Preview版本升级为General Availability.相反,我们将所有 ...

  8. Oracle Database 20c 十大新特性一览

    从大会的分享和公布的资料中,我们整理了其中重要的新特性,汇聚成10个方向,按照惯例,和大家分享. 历史回顾: Oracle Database 20c 新特性: 1.原生的区块链支持 - Native ...

  9. oracle 峰度 函数,Oracle Database 21c 十大新特性一览

    摘要:Oracle 考虑到 2020 年我们的客户将面临前所未有的经济和业务中断.我们决定不将 Database 20c Preview 版本升级为 General Availability. 相反, ...

最新文章

  1. 32位微型计算机quot;中的32指的是,《计算机应用基础作业一).doc
  2. 从门禁系统的使用体验看良好的交互设计原则
  3. FF称签约美国百年顶级投行Stifel;Facebook隐私泄露继续发酵,黑客明码标卖聊天信息 | 雷锋早报...
  4. 【NLP】谷歌、伯克利联合研究:为5种大型NLP模型,彻底算算这笔账
  5. C++一天一个程序(一)
  6. 跟我一起玩Win32开发(20):浏览文件夹
  7. mysql查询没有权限试图_MySQL迁移后提示查询view权限不足的处理
  8. java中fileter用法,Java 8 使用Lambda表达式的FileFilter示例
  9. 软工专硕考研_2021考研人数将突破400万?录取率或成史低!
  10. Banner中利用Jquery隐藏显示下方DIV块
  11. angularJS 绑定操作
  12. Repeater控件如何让变量自增 asp.net
  13. 4 数据操作+数据预处理
  14. 猝不及防,iOS9.3测试版已经遭到越狱?
  15. MVC中code first方式开发,数据库的生成与更新
  16. JS-13-jquery
  17. 机器学习深度学习入门学习资料大全(一)
  18. JavaScript获取当前url路径
  19. 两数相加(有序/无序) 时间复杂度小于 O(n2)做题心得
  20. STM32存储器知识的相关应用(IAP、Bit Banding)

热门文章

  1. python编程从入门到实战16章x轴刻度_PYTHON编程:从入门到实践之数据可视化
  2. html5模板区别,网页设计和平面设计理念的六大区别
  3. linux ubuntn j经验
  4. Android 实现计时器功能,Android实现倒计时30分钟功能
  5. 西门子plc200 c语言转换,s7-200程序转换成s7-1200方法
  6. feign返回结果统一处理_SpringCloud异常处理统一封装我来做-使用篇
  7. 男孩子初中毕业学计算机技术,男孩子初中毕业学什么技术好就业
  8. python连接sqlserver_python连接SQL Server数据库
  9. 人脸对齐(十七)--DenseReg
  10. 目标检测(五)--R-CNN