我们采用prebuilt table创建的快照和物化视图可以避免这样的情况。
master table 是scott.trade 已经建立了mlog
snapshot on prebuit table是zhangbin.trade;快照建立在prebuilt table是本方法的前提。
SQL>show user
SYS
在主表上添加字段,且之前作了刷新——保证主表和快照数据一致
SQL> alter table scott.trade add zb varchar2(20) default ''ab'';
Table altered.
删除快照,但on prebult table还在
SQL> drop snapshot zhangbin.trade;
Materialized view dropped.
SQL> select count(*) from slog$;
COUNT(*)
----------
0
在prebult table上添加字段,执行同样的ddl
SQL> alter table zhangbin.trade add zb varchar2(20) default ''ab'';
Table altered.
SQL> connect zhangbin/zhangbin
Connected.
重新创建快照
SQL> create snapshot trade on prebuilt table as select * from scott.trade;
Materialized view created.
快速刷新成功。
SQL> execute dbms_snapshot.refresh(''trade'',''fast'');
PL/SQL procedure successfully completed.
SQL> show user
USER is "ZHANGBIN"
SQL> update scott.trade set zb=''ddd'';
13 rows updated.
SQL> commit;
Commit complete.
SQL> execute dbms_snapshot.refresh(''trade'',''fast'');
PL/SQL procedure successfully completed.
可以参考itpub讨论 http://www.itpub.net/showthread.php?s=&threadid=330470