今天遇到了一個有些類似於“審計”的問題。
       因為在檢查all_objects時發現有一張表的last_ddl_time發生了變化,為了防止是其結構發生變化,進而進行了檢查。但是如果沒有對原始表的結構記錄,該如何處理呢?
        因為當時該資料庫已經開啟了FLASH BACK功能,所以通過這個線索來進行處理。
        進行如下方法:
      
select    tab_log_ver
as select *
    from tab_log as timestamp(`2008-12-08 8:00:00`, `YYYY-MM-DD HH24:MI:SS`) where rownum<5;

     
      然後比對tab_log_ver和tab_log欄位沒有發現不同。為防止判斷有問題,又做了進一步的實驗:
     

首先建立一張測試表:
SQL> desc test_log_ver
Name                Type                    Nullable Default Comments
———– ————- ——– ——- ——–
MESSAGE_ID    VARCHAR2(100)                                                    
TASK_ID         VARCHAR2(18)                                                        
SUBMIT_TIME VARCHAR2(14)    Y                                                
TERMINAL_ID VARCHAR2(20)    Y                                                
STATUS            CHAR(10)            Y

   
       然後開始修改該測試表的結構:
      

SQL> alter table test_log_ver modify (MESSAGE_ID varchar2(30));

Table altered

Executed in 0.125 seconds

SQL> alter table test_log_ver add(test_col number);

Table altered

Executed in 0 seconds

SQL> select object_name,
    2                 to_char(created, `yyyy-mm-dd hh24:mi:ss`) created,
    3                 to_char(last_ddl_time, `yyyy-mm-dd hh24:mi:ss`) last_ddl_time
    4        from user_objects
    5     where object_name = `TEST_LOG_VER`
    6    ;

OBJECT_NAME      CREATED              LAST_DDL_TIME
—————- ——————-  ———————
TEST_LOG_VER     2008-12-08 15:38:00  2008-12-08 15:46:15

Executed in 0.016 seconds

      試圖檢查修改之前的資料資訊:
   

select * from test_log_ver as of timestamp
to_timestamp(`2008-12-08 15:38:10`, `YYYY-MM-DD HH24:MI:SS`)

ORA-01466: unable to read data – table definition has changed

      報ORA-01466錯誤。使用FLASHBACK TABLE來執行,同樣的報錯資訊。
     

SQL> select to_char(sysdate,`yyyy-mm-dd hh24:mi:ss`) SYSDATE from dual;

SYSDATE
———————–
2008-12-08 16:28:50

在16:28分時,執行FLASHBACK操作,並且指定的時間大於2008-12-08 15:46:15。

SQL> flashback    table XXX.test_log_ver to timestamp to_timestamp(`2008-12-08 15:50:00`, `YYYY-MM-DD HH24:MI:SS`);

Flashback complete.
成功執行!

       這裡我們不難發現,如果結構發生改變,基於FLASH BACK的查詢或者恢復都會有一定的問題,它只能恢復到修改後的時間點。畢竟FLASHBACK是為資料的快速恢復來設計使用的。
        但是可以在一定的程度上證明,資料結構沒有發生改變的時間。否則就會報ORA-01466錯誤了。
        -:)