Oracle在9i提供了在线重定义功能,利用这个功能可以在线修改表的逻辑结构或物理结构。不过在10g以前的版本,原表上的所有的索引、触发器、约束、统计信息和权限都需要在目标表上手工创建,不过从10g开始,Oracle提供了新的过程COPY_TABLE_DEPENDENTS,大大简化了在线重定义的步骤。
9i中使用在线重定义的例子:http://yangtingkun.itpub.net/post/468/12962
通过10g的COPY_TABLE_DEPENDENTS过程,极大的简化了在线重定义所需要的手工处理部分,一个包含索引、约束、触发器、统计信息和授权的表的在线重定义过程,只需要下面的步骤就可以完成:
SQL> CREATE TABLE T AS SELECT ROWNUM ID, A.* FROM USER_OBJECTS A;
表已创建。
SQL> ALTER TABLE T ADD PRIMARY KEY (ID);
表已更改。
SQL> ALTER TABLE T ADD CHECK (ID > 0);
表已更改。
SQL> GRANT INSERT ON T TO SYSTEM;
授权成功。
SQL> CREATE INDEX IND_T_NAME ON T (OBJECT_NAME);
索引已创建。
SQL> CREATE OR REPLACE TRIGGER TRI_T BEFORE INSERT ON T FOR EACH ROW
2 BEGIN
3 NULL;
4 END;
5 /
触发器已创建
SQL> EXEC DBMS_STATS.GATHER_TABLE_STATS(USER, 'T')
PL/SQL 过程已成功完成。
SQL> CREATE TABLE T_INTER PARTITION BY HASH (ID)
2 PARTITIONS 4
3 AS SELECT ROWNUM ID, A.* FROM USER_OBJECTS A WHERE 1 = 2;
表已创建。
初始表已经准备好了,准备改成的分区表也已经建立成功,下面开始在线重定义过程:
SQL> SET SERVEROUT ON SIZE 1000000
SQL> BEGIN
2 DBMS_REDEFINITION.CAN_REDEF_TABLE(USER, 'T');
3 END;
4 /
PL/SQL 过程已成功完成。
SQL> BEGIN
2 DBMS_REDEFINITION.START_REDEF_TABLE(USER, 'T', 'T_INTER');
3 END;
4 /
PL/SQL 过程已成功完成。
SQL> VAR V_NUM NUMBER
SQL> BEGIN
2 DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(USER, 'T', 'T_INTER',
3 DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, :V_NUM, TRUE);
4 END;
5 /
PL/SQL 过程已成功完成。
SQL> PRINT V_NUM
V_NUM
----------
0
SQL> BEGIN
2 DBMS_REDEFINITION.FINISH_REDEF_TABLE(USER, 'T', 'T_INTER');
3 END;
4 /
PL/SQL 过程已成功完成。
在线重定义操作已经完成,下面可以检查索引、约束、权限、触发器和统计信息是否已经被成功克隆:
SQL> SELECT TABLE_NAME, INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME INDEX_NAME
------------------------------ ------------------------------
T SYS_C006293
T IND_T_NAME
T_INTER TMP$$_SYS_C0062930
T_INTER TMP$$_IND_T_NAME0
SQL> SELECT TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE
2 FROM USER_CONSTRAINTS WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME CONSTRAINT_NAME C
------------------------------ ------------------------------ -
T SYS_C006294 C
T SYS_C006293 P
T_INTER TMP$$_SYS_C0062930 P
T_INTER TMP$$_SYS_C0062940 C
SQL> SELECT TABLE_NAME, TRIGGER_NAME FROM USER_TRIGGERS WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME TRIGGER_NAME
------------------------------ ------------------------------
T TRI_T
T_INTER TMP$$_TRI_T0
SQL> SELECT TABLE_NAME, PRIVILEGE FROM USER_TAB_PRIVS WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME PRIVILEGE
------------------------------ ----------------------------------------
T_INTER INSERT
T INSERT
SQL> SELECT TABLE_NAME, NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME NUM_ROWS
------------------------------ ----------
T 34
T_INTER 34
SQL> SELECT TABLE_NAME, PARTITION_NAME FROM USER_TAB_PARTITIONS
2 WHERE TABLE_NAME IN ('T', 'T_INTER');
TABLE_NAME PARTITION_NAME
------------------------------ ------------------------------
T SYS_P41
T SYS_P42
T SYS_P43
T SYS_P44
SQL> DROP TABLE T_INTER PURGE;
表已删除。
所有的表相关对象已经创建成功,且在线重定义操作也顺利完成,最后删除中间表即可。
分享到:
相关推荐
该文件名为《分析模式——可复用的对象模型》,是一部探讨如何通过设计模式建立可复用对象模型的专业著作。书中内容针对程序开发人员,尤其是对在程序开发中应用设计模式及构建可复用对象模型有深厚兴趣的专业人士。...
论文研究-一种决策知识表示和进行模糊决策的新方法——模糊决策表.pdf, 集中于决策表方法的几个方面,以(确定的)决策表形式为基础对其进行模糊扩展,以便于处理不精确...
在这个实验中,我们将深入探讨顺序表的实现及其相关操作。 顺序表是一种线性数据结构,它的元素在内存中是连续存放的,就像数组一样。每个元素都有一个唯一的索引,索引从0开始,可以通过索引来直接访问表中的任何...
"安卓Android源码——课程表.zip" 提供的资源很可能是一个关于构建课程表应用的源代码示例。这个应用可能帮助用户管理和查看他们的课程时间表,具有实用价值。下面我们将详细探讨与安卓源码、课程表应用相关的知识点...
在这个“javaswing课程设计——课程表”项目中,学生或初学者将学习如何利用Swing来开发一个功能齐全的课程表应用。 首先,我们需要了解Java Swing的基本使用。Swing是基于事件驱动模型的,也就是说,用户在界面上...
接口是对象的蓝图,它定义了对象的行为,但不包含实现细节。这种设计让客户端代码可以与具体实现解耦,增强了代码的稳定性和可维护性。 书中会详细讲解COM的生命周期管理,包括创建、使用和释放组件的过程。COM采用...
根据提供的文件内容,以下是关于《6G白皮书——6G无线智能无处不在的关键驱动与研究挑战》中所涉及的知识点: 6G通信技术代表了下一代无线通信技术,预计将在未来十年内投入使用,其将超越目前的5G技术,带来更高...
Java基础——面向对象编程 面向对象编程(Object-Oriented Programming,OOP)是一种编程方法,它将现实世界中的对象抽象出来,并使用计算机模型来描述。面向对象编程的核心概念是类(class)和实例(instance)。...
`start`和`end`分别表示要复制的起始行和结束行,`startrow`是新表开始粘贴的行数,`sheetnum`是要操作的工作表数量。函数首先打开源文件(`old.xlsx`),然后遍历指定的行和工作表,将数据复制并粘贴到目标文件(`...
本篇PPT课件详细介绍了面向对象的五个关键特点以及类与对象的相关知识。 1. 面向对象程序设计特点: - **抽象**:抽象是将现实世界中的复杂系统简化为易于理解的模型,忽略不重要的细节,只关注核心特性。在编程中...
COM技术的核心在于对象的封装、接口定义、线程管理和自动内存管理,这些特性使得COM组件能够被广泛应用于各种软件开发中,包括Windows操作系统的核心组件、ActiveX控件以及许多应用程序的插件系统。 标题"COM技术...
这份“python面向对象presentation——PPT(含源码)”是为学习者提供了一个深入理解面向对象编程的资源,适合学生用于presentation或自我学习。 1. **面向对象编程基础** - 类(Class):类是创建对象的模板,...
《Visual C++ 面向对象编程教程——王育坚》是一本专为学习MFC(Microsoft Foundation Classes)和面向对象编程技术而设计的教学资料。该教程以幻灯片的形式呈现,结合实例与详细的讲解,使得学习过程更为直观且易于...
【实验报告】——Java类与对象的应用 在Java编程中,类是面向对象编程的核心,它代表了现实世界中的实体或者概念。对象则是类的实例,具有特定的属性(成员变量)和行为(成员方法)。本实验旨在通过设计一个贷款类...
本文将深入探讨C++的面向对象特性,包括类、对象、封装、继承、多态等核心概念。 首先,C++中的“类”(Class)是面向对象编程的基础,它是一种用户自定义的数据类型,用于描述一类对象的属性(成员变量)和行为...
### JavaScript核心对象参考手册知识点概览 #### 一、书籍基本信息 - **书名**:即用即查——JavaScript核心对象参考手册 - **作者**:韩延峰编著 - **ISBN**:978-7-115-16140-6 - **定价**:49元 - **出版时间**...
"安卓Android源码——360新版特性界面源代码.zip" 这个标题揭示了我们要探讨的核心内容:这是一份与安卓(Android)操作系统相关的源代码,特别是针对360公司新版本产品中的特性界面的源代码。这份源代码可能是360在...
根据提供的文档内容,我们可以归纳出一系列关于C++的重要知识点,这些知识点主要涵盖了C++的基础语法、数据类型、内存管理、程序结构以及高级特性如类、继承与多态等。下面将详细阐述这些知识点: ### 1. 引言 C++...
总结来说,"g-p.rar_G-P_G——p_Matlab关联维数_关联维数_关联维数G-P"这个压缩包文件提供了一个基于Matlab的G-P方法实现,用于计算混沌系统的时间序列数据的关联维数,从而帮助我们理解和分析系统的复杂动态行为。...