多應用共享資料表時,資料列可能在「你最不期望的時候」被修改、刪除。傳統靠 LogMiner 分析歸檔日誌雖可行但門檻高、流程繁瑣。
10g 引入,基於自動 UNDO 管理與 UNDO 表空間,直接在 SQL 中查詢資料列歷史版本。
SELECT ... FROM table_name
VERSIONS BETWEEN { SCN | TIMESTAMP } { expr | MINVALUE } AND { expr | MAXVALUE }
...
UNDO_RETENTION 參數設定值或最近 DDL (CREATE/ALTER/DROP) 之前,以較早者為準。SELECT versions_starttime, versions_endtime,
versions_xid, versions_operation,
part_id, description
FROM parts
VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE
WHERE part_id = 12345
ORDER BY versions_starttime;
關鍵偽欄位:
VERSIONS_STARTTIME / ENDTIME:版本生效/失效時間。VERSIONS_STARTSCN / ENDSCN:對應 SCN。VERSIONS_XID:交易 ID,可關聯同一交易修改的其他表/行。VERSIONS_OPERATION:I (Insert)、U (Update)、D (Delete)。SELECT xid, start_scn, commit_scn,
operation, logon_user, undo_sql
FROM flashback_transaction_query
WHERE xid = HEXTORAW('08001200ABC123'); -- 取自 VERSIONS_XID
UNDO_SQL)。ROW_ID 欄位僅為視圖顯示用,非 ROWID 偽欄位。UNDO_MANAGEMENT=AUTO) 並建立足夠大小的 UNDO 表空間。UNDO_RETENTION (秒),保證歷史版本保留窗口。NOPARALLEL、NOCACHE 等阻礙版本生成的屬性 (罕見)。FLASHBACK TABLE ... TO TIMESTAMP)。回溯版本查詢 + 回溯交易查詢,將原本需要 DBA 深度介入的日誌分析工作,降維為開發人員可直接使用的 SQL 功能。善用 UNDO 保留窗口,讓資料庫擁有「時光機」能力。