Table的学习 ②

Table的学习 ②
四、联机重定义表
 
    联机重定义的意义在于:
 
    ● 修改表的存储参数
    ● 将表移动到相同模式中的不同表空间
    ● 添加对并行查询的支持
    ● 添加、删除分区支持
    ● 重建表以减少碎片
    ● 将普通表(堆积结构)结构改变为索引结构
    ● 添加、删除列
 
    使用DBMS_REDEFINITION包进行联机重定义。
 
1、表的联机重定义步骤
 
    ① 调用DBMS_REDEFINITION.CAN_REDEF_TABLE()过程,确认该表是否可以联机重定义。
 
    ② 创建一个具有所有所需属性的空的临时过渡表(同一模式中)
 
    ③ 调用DBMS_REDEFINITION.START_REDEF_TABLE()启动重定义进程
        注:需要提供:重定义对象、临时过渡表、列的映射 (没有映射则默认所有列)
 
    ④ 在临时过渡表上创建触发器、索引、授权、约束
        注:必须以停用状态进行创建
 
    ⑤ 执行DBMS_REDEFINITION.FINISH_REDEF_TABLE()完成重定义。
        在此期间完成的工作包括:
        * 重定义原始表,使其具有临时过渡表所有的属性、索引、约束、授权、触发器
        * 包含临时过渡表的参照约束包含最终的被重定义的表并被启用
        注:在这个过程中,原始表会加上一会排他锁(时间很短,且不依赖于表的大小)
 
    重定义过程的最终结果是:
 
    ● 原始表按照临时过渡表的属性和特点被重定义
    ● START_REDEF_TABLE()和FINISH_REDEF_TABLE()期间在临时过渡表上定义的触发器、授权、索引和约束现在定义到被重定义的表上并被启用。
    ● 原始表上的所有触发器、授权、索引和约束转换到临时表上,删除临时表时将它们删除
    ● 原始表上定义的任何PL/SQL过程和游标都无效,下次使用时自动生效
 
2、中间同步
 
    在调用START_REDEF_TABLE()和FINISH_REDEF_TABLE()期间,可能会在原始表上执行大量的DML语句,如果这样,可是使用周期性得使临时表与原始表同步。
 
    可以用DBMS_REDEFINITION.SYNC_INTERIM_TABLE()过程来进行,这个过程可以减少为完成重定义过程而调用FINISH_REDEF_TABLE()时所花的时间。但是在FINISH_REDEF_TABLE()期间原始表被加锁的那一小段时间与是否调用过SYNC_INTERIM_TABLE()无关
 
3、出错后的中止和清除
 
    如果在重定义中途出错,则调用DBMS_REDEFINITION.ABORT_REDEF_TABLE()。
 
    这个过程会删除与重定义进程相关的临时日志和表。但是临时过渡表相关的对象需要手动删除。
 
4、举例
 
    重定义以下列:
    * 列salary乘以系数1.10并重命名为sal
    * 删除phone列
    * 添加默认值为10的一个新的deptno列
    * 重定义的表按empno列的范围分区
 
    假定已经运行了DBMS_REDEFINITION.CAN_REDEF_TABLE()过程,且表emp可以被重定义,则重定义步骤如下:
 
    ① 创建临时过渡表int_emp
 
    CREATE TABLE int_emp
    (empno NUMBER PRIMARY KEY,
     name VARCHAR2(100),
     sal NUMBER,
     deptno NUMBER DEFAULT 10)
    PARTITION BY RANGE(empno)
    (PARTITION emp1000 VALUES LESS THAN (1000) TABLESPACE tbs_1,
     PARTITION emp2000 VALUES LESS THAN (2000) TABLESPACE tbs_2);
 
    ② 启动重定义进程
 
    DBMS_REDEFINITION.START_REDEF_TABLE('u1','emp','int_emp','empno empno,name name salary*1.10 sal');
 
    ③ 在int_emp上创建触发器、索引和约束。
 
    在重定义的最后一步中,这些将被转移换回原始表。在int_emp上的任何参数约束应被停用。可以定义与临时过渡表相关的任何授权,重定义之后,这些授权将取代原始表上的授权。
 
    ④ 可选地,同步临时过渡表
 
    DBMS_REDEFINITION.SYNC_INTERIM_TABLE('u1','emp','int_emp');
 
    ⑤ 完成重定义
 
    DBMS_REDEFINITION.FINISH_REDEF_TABLE('u1','emp','int_emp');
    --此后表emp被加锁一小段时间,此后表emp被重定义,具有了int_emp的所有属性。
 
    ⑥ 删除临时过渡表
 
5、限制
 
    表的联机重定义有一下限制:
 
    ● 表必须有主键才能被联机重定义
    ● 将被重定义的表和临时过渡表必须有相同的主键列
    ● 定义过物化视图、物化视图日志的表不能被联机重定义
    ● 索引结构表的溢出表不能被联机重定义
    ● 具有用户定义类型(对象、REF、收集、类型化表)的表不能被联机重定义
    ● 具有FILE列的表不能被联机重定义
    ● 具有LONG列的表不能被联机重定义(但是有LOB列的表可以)
    ● 要重定义的表不能是簇的一部分
    ● SYS和SYSTEM模式中的表不能被联机重定义
    ● 临时表不能被重定义
    ● 没有同一级别的子设置值支持
    ● 在将临时过渡表中的列映射到原始表中的列时,只能使用简单的确切的表达式(例如不允许使用子查询)
    ● 如果重定义时添加列,在重定义完成之前,不能将其声明为NOT NULL
    ● 在正被重定义的表和临时过渡表之间没有任何参照约束
 
 
 
五、删除表
 
    使用DROP TABLE语句删除表,使用CASCADE选项来删除相关信息
 
    DROP TABLE emp;
    DROP TABLE emp CASCADE CONSTRAINTS; --可以删除子表中的外键约束
 
    删除表时需要注意以下几点:
 
    ● 删除表后与表相关的所有索引、触发器也会被删除。
    ● 与表相关的PL/SQL程序单元仍保留,但无效

你可能感兴趣的:(Table的学习 ②)