基于dbms_redefinition在线重定义表(四)
s where table_name in('TB_EMP_INT','TB_EMP');
CONSTRAINT_NAME TABLE_NAME STATUS
------------------------------ ------------------------------ --------
SYS_C0024681 TB_EMP ENABLED
PK_TB_EMP TB_EMP ENABLED
FK_TB_EMP_DEPT_NO TB_EMP ENABLED
TMP$$_SYS_C00246810 TB_EMP_INT ENABLED
TMP$$_PK_TB_EMP0 TB_EMP_INT ENABLED
TMP$$_FK_TB_EMP_DEPT_NO0 TB_EMP_INT DISABLED
--查看表tb_emp,此时重定义表插入了36条记录
scott@USBO> select count(*) from tb_emp;
COUNT(*)
----------
36
--临时表上的记录为5
scott@USBO> select count(*) from tb_emp_int;
COUNT(*)
----------
5
--下面的过程用于同步重定义表与临时表
scott@USBO> exec dbms_redefinition.sync_interim_table('SCOTT', 'TB_EMP', 'TB_EMP_INT');
PL/SQL procedure successfully completed.
--这是同步后的结果
scott@USBO> select count(*) from tb_emp_int;
COUNT(*)
----------
39
--最后完成在线重定义,此时如果重定义表上事务没有被完成,需要等到所有事务完成
scott@USBO> exec dbms_redefinition.finish_redef_table('SCOTT', 'TB_EMP', 'TB_EMP_INT');
PL/SQL procedure successfully completed.
scott@USBO> select count(*) from tb_emp_int;
COUNT(*)
----------
100
--检验结果,可以看到列salary上的值发生了变化
scott@USBO> select new.salary new_sal, old.sal old_sal,new.deptno new_deptno,old.deptno old_detpno
2 from tb_emp new, tb_emp_int old
3 where new.empno = old.empno and rownum<=3;
NEW_SAL OLD_SAL NEW_DEPTNO OLD_DETPNO
---------- ---------- ---------- ----------
111.1 101 20 20
112.2 102 10 10
113.3 103 20 20
--验证触发器
scott@USBO> select table_name, trigger_name
2 from user_triggers;
TABLE_NAME TRIGGER_NAME
------------------------------ ------------------------------
TB_EMP TR_BF_TB_EMP_HIREDATE
TB_EMP_INT TR_BF_TB_EMP_INT_HIREDATE
--Author : Leshami
--Blog : http://blog.csdn.net/leshami
--此时临时表上的触发器被应用到重定义的表
scott@USBO> select trigger_body from user_triggers
2 where table_name = 'TB_EMP';
TRIGGER_BODY
--------------------------------------------------------------------------------
BEGIN
:new.hiredate := to_char(SYSDATE + 10,'yyyymmdd hh24:mi:ss');
END tr_bf_int_emp_hiredate;
scott@USBO> desc tb_emp
Name Null Type
----------------------------------------------------------------------------------- -------- --------------------
EMPNO NUMBER(4)
NAME VARCHAR2(20)
HIREDATE VARCHAR2(20)
SALARY NUMBER
DEPTNO NUMBER(2)
scott@USBO> select column_name,data_type, data_default from dba_tab_columns
2 where owner='SCOTT' and table_name='TB_EMP' and column_name