电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

9i新特性之——在线表格重定义研究5


发布日期:2020/2/22
 

所有的工作都准备完成我们执行重构完成的过程这个过程将执行表的交换

SQL> execute DBMS_REDEFINITIONFINISH_REDEF_TABLE(MYTESTTEST INT_TEST);

PL/SQL procedure successfully completed

我们还是往test表中插入数据将有什么结果呢?

SQL> insert into test values();

row inserted

SQL> select count(*) from test;

SQL> select count(*) from int_test;

SQL> select * from mlog$_test;

select * from mlog$_test

ORA: table or view does not exist

SQL> select * from rupd$_test;

select * from rupd$_test

ORA: table or view does not exist

SQL> select c from audit_test;

可以看到这里的触发器执行的是以前在ini_test(中间表)上的触发器上一次是这次是

这里发生了一个很有趣的转换其实整个核心就是这里ORACLE这里完成了表test到int_test的表换名的工作只是所有的约束索引或触发器名称还是保持了原来的名称

SQL> select tindex_namettable_name from user_indexes t;

INT_TEST_PK TEST

PK_TEST_ID INT_TEST

SQL> select ttrigger_namettable_name from user_triggers t;

TR_INT_TEST TEST

TR_TEST INT_TEST

我们检查对象权限

SQL> select * from USER_TAB_PRIVS_MADE;

SYSTEM INT_TEST MYTEST SELECT NO NO

SYSTEM INT_TEST MYTEST DELETE

SYSTEM TEST MYTEST SELECT NO NO

SYSTEM TEST MYTEST UPDATE

这里可以看到对于所有数据字典中的这两个名称其实是完成了一个表的名字对换的过程所以对于原表的特性我们必须在新表中给予相同的特性这样才能真正的转换到新的表

大功告成我们可以删除中间表并且有可能的话修改约束索引触发器的名称与原来一致如果你认为不重要可以不予修改

SQL> drop table int_test;

Table dropped

如果是以上版本我们可以对索引约束换名但是以下版本最好就是删除重新建立了

如果运行了START_REDEF_TABLE 过程开始我们就必须运行

dbms_redefinitionabort_redef_table(MYTESTTESTINT_TEST);来终止整个重构过程到这里就算是完了

SQL> select object_name object_type status object_id data_object_id from user_objects order by ;

OBJECT_NAME OBJECT_TYPE STATUS OBJECT_ID DATA_OBJECT_ID

AUDIT_TEST TABLE VALID

TEST TABLE VALID

TEST TABLE PARTITION VALID

TEST TABLE PARTITION VALID

TEST TABLE PARTITION VALID

TEST TABLE PARTITION VALID

rows selected

看到这里你也应该相信转换已经完成了吧现在是分区表了

总结

本文不想从大的框架上来说明问题而是用一些例子来说明问题

这样可能会更让大家明白其中发生的一切

这里尽量的模拟了实际可能会遇到的情况

如约束索引触发器对象权限这个在重新定义的时候需要注意什么需要我们手工完成什么

外键约束这里没有举例说明其实与普通约束一样只是在中间表上建立外键约束的时候最好先禁止掉(DISABLE)等完成之后再打开

其实主要过程就是完成了一个表的记录的拷贝(通过快照)最后在数据字典中换名的工作

上一篇:实战管理联机日志

下一篇:raw