熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

OracleDatabase10g:閃回版本查詢

2013-11-13 15:44:05  來源: Oracle 

  不需要設置立即識別對行的所有更改

  在 Oraclei Database 中我們看到它推出了以閃回查詢形式表示的時間機器該特性允許 DBA 看到特定時間的列值只要在還原段中提供該數據塊此前鏡像的拷貝即可但是閃回查詢只提供某時刻數據的固定快照而不是在兩個時間點之間被更改數據的運行狀態表示某些應用程序如涉及到外幣管理的應用程序可能需要了解一段時期內數值數據的變化而不僅僅是兩個時間點的數值由於閃回版本查詢特性Oracle Database g 能夠更方便高效地執行該任務

  查詢對表的更改

  在本示例中我使用了一個銀行外幣管理應用程序其數據庫含有一個名稱為 RATES 的表用於記錄特定時間的匯率

  SQL> desc rates
    Name              Null?Type
   
    CURRENCY                   VARCHAR()
    RATE                       NUMBER()

  該表顯示 US$ 與各種其他貨幣的匯率在 CURRENCY 列中顯示在金融服務行業中匯率不但在變更時進行更新而且被記錄在歷史中需要這種方式的原因是銀行交易可能在過去時間生效以便適應由於匯款而耗費的時間例如對於一項在上午 : 發生但在上午 : 生效的交易其有效匯率是上午 : 的匯率而不是現在的匯率

  直到現在唯一的選擇是創建一個匯率歷史表來存儲匯率的變更然後查詢該表是否提供歷史記錄另一種選擇是在 RATES 表本身中記錄特定匯率適用性的開始和結束時間當發生變更時現有行中的 END_TIME 列被更新為 SYSDATE並插入一個具有新匯率的新行其 END_TIME 為 NULL

  但是在 Oracle Database g 中閃回版本查詢特性不需要維護歷史表或存儲開始和結束時間使用該特性您不必進行額外的設置即可獲得某行在過去特定時間的值

  例如假定該 DBA 在正常業務過程中數次更新匯率 ― 甚至刪除了某行並重新插入該行

  insert into rates values (EURO);
    commit;
    update rates set rate = ;
    commit;
    update rates set rate = ;
    commit;
    delete rates;
    commit;
    insert into rates values (EURO);
    commit;
    update rates set rate = ;
    commit;

  在進行了這一系列操作後DBA 將通過以下命令獲得 RATE 列的當前提交值

  SQL> select * from rates;

  CURR       RATE
   
    EURO    

  此輸出顯示 RATE 的當前值沒有顯示從第一次創建該行以來發生的所有變更這時使用閃回查詢您可以找出給定時間點的值但我們對構建變更的審計線索更感興趣 ― 有些類似於通過便攜式攝像機來記錄變更而不只是在特定點拍攝一系列快照

  以下查詢顯示了對表所做的更改

  select versions_starttime versions_endtime versions_xid
    versions_operation rate
    from rates versions between timestamp minvalue and maxvalue
    order by VERSIONS_STARTTIME
    /

  VERSIONS_STARTTIME     VERSIONS_ENDTIME       VERSIONS_XID     V       RATE
   
    DEC PM  DEC PM  C I    
    DEC PM  DEC PM  AA U    
    DEC PM  DEC PM  AB U    
    DEC PM                         AC D    
    DEC PM  DEC PM  AD I    
    DEC PM                         AE U    

  注意此處顯示了對該行所作的所有更改甚至包括該行被刪除和重新插入的情況VERSION_OPERATION 列顯示對該行執行了什麼操作 (Insert/Update/Delete)所做的這些工作不需要歷史表或額外的列

  在上述查詢中列 versions_starttimeversions_endtimeversions_xidversions_operation 是偽列與 ROWNUMLEVEL 等其他熟悉的偽列相類似其他偽列 ― 如 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN ― 顯示了該時刻的系統更改號列 versions_xid 顯示了更改該行的事務標識符有關該事務的更多詳細信息可在視圖 FLASHBACK_TRANSACTION_QUERY 中找到其中列 XID 顯示事務 id例如使用上述的 VERSIONS_XID 值 ADUNDO_SQL 值顯示了實際的語句

  SELECT UNDO_SQL
    FROM FLASHBACK_TRANSACTION_QUERY
    WHERE XID = AD;

  UNDO_SQL
   
    insert into ANANDARATES(CURRENCYRATE) values (EURO);

  除了實際語句之外該視圖還顯示提交操作的時間標記和 SCN查詢開始時的 SCN 和時間標記以及其他信息

  找出一段時期中的變更

  現在讓我們來看如何有效地使用這些信息假設我們需要找出下午 :: 時 RATE 列的值我們可以執行

  select rate versions_starttime versions_endtime
    from rates versions
    between timestamp
    to_date(// ::mm/dd/yyyy hh:mi:ss)
    and to_date(// ::mm/dd/yyyy hh:mi:ss)
    /

  RATE VERSIONS_STARTTIME     VERSIONS_ENDTIME
   
       

  此查詢與閃回查詢類似在以上的示例中開始和結束時間為空表示匯率在該時間段中沒有更改而是包含一個時間段還可以使用 SCN 來找出過去的版本值可以從偽列 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN 中獲得 SCN 號以下是一個示例

  select rate versions_starttime versions_endtime
    from rates versions
    between scn and
    /

  使用關鍵詞 MINVALUE 和 MAXVALUE可以顯示還原段中提供的所有變更您甚至可以提供一個特定的日期或 SCN 值作為范圍的一個端點而另一個端點是文字 MAXVALUE 或 MINVALUE例如以下查詢提供那些只從下午 :: 開始的變更而不是全部范圍的變更

  select versions_starttime versions_endtime versions_xid
    versions_operation rate
    from rates versions between timestamp
    to_date(// :: mm/dd/yyyy hh:mi:ss)
    and maxvalue
    order by VERSIONS_STARTTIME
    /

  VERSIONS_STARTTIME     VERSIONS_ENDTIME       VERSIONS_XID     V       RATE
   
    DEC PM                         AC D    
    DEC PM  DEC PM  AD I    
    DEC PM                         AE U    

  最終的分析

  閃回版本查詢隨取隨用地復制表變更的短期易變數值審計這一優點使得 DBA 能夠獲得過去時間段中的所有變更而不是特定值只要還原段中提供數據就可以盡情使用因此最大的可用版本依賴於 UNDO_RETENTION 參數

  有關閃回版本查詢的更多信息請參見 Oracle Database Concepts g Release () 指南的相關部分


From:http://tw.wingwit.com/Article/program/Oracle/201311/17217.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.