No versão 10g é possivel buscar dados realizando consultas AS OF, porém nem sempre é retornado um valor, lembrando que os dados relativos a selects AS OF são buscados na undo obedecendo a uma política de retenção.
Na versão 11g esse limite acaba com o Flashback Data Archive, que faz parte o Oracle Total Recall, onde uma tabela interna é criada para armazenar dados históricos de outra tabela com FDA habilitada.
O que há de novo?
Processo de segundo plano: FBDA (Flashback Data Archive), A cada cinco minutos realiza a cópia dos dados em undo para tabela históricas.
Privilégios:
FLASHBACK ARCHIVE ADMINISTER.
FLASHBACK ARCHIVE.
Views Relacionadas:
DBA_FLASHBACK_ARCHIVE: Informações sobre flashback archive.
DBA_FLASHBACK_ARCHIVE_TS: Informações de todas as tablespaces contendo flashback archive.
DBA_FLASHBACK_ARCHIVE_TABLES: Informações de quais tabelas tem dados históricos.
Requer:
Automatic Undo Managment.
ASSM Automatic Segment Space Management para a tablespace onde irá residir o FDA.
Exemplo:
Criando a tablespace que irá armazenar a FDA:
CREATE TABLESPACE FBHISTORYCriando o FDA:
DATAFILE '/u01/app/oracle/oradata/orcl/fbhistory01.dbf' SIZE 100M
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;
CREATE FLASHBACK ARCHIVE DEFAULT hr_histConcedendo as permissões:
TABLESPACE FBHISTORY
QUOTA 1G
RETENTION 1 MONTH;
GRANT FLASHBACK ARCHIVE ON hr_hist TO hr;Alterando a retenção, apenas alterada para teste, não deve ser imposta em ambientes de produção:
alter system set undo_retention=1;Habilitando a feature para tabela:
con hrAtualizando a tabela e obtendo dados do passado com select AS OF:
ALTER TABLE EMPLOYEES FLASHBACK ARCHIVE;
SQL> alter session set nls_date_format='DD/MM/YYYY hh24:mi:ss';Valor original:
Session altered.
SQL> select sysdate from dual;
SYSDATE
-------------------
26/08/2009 21:39:15
SQL> select EMPLOYEE_ID as ID, LAST_NAME||' '||FIRST_NAME as Name, JOB_ID, SALARY from employees where EMPLOYEE_ID = 100;
ID NAME JOB_ID SALARY
---------- ---------------------------------------------- ---------- ----------
100 King Steven AD_PRES 24000
Atualizando a tabela:
SQL> update employees set salary=salary*3 where EMPLOYEE_ID=100;
1 row updated.
SQL> commit;
Commit complete.
SQL> select EMPLOYEE_ID as ID, LAST_NAME||' '||FIRST_NAME as Name, JOB_ID, SALARY from employees where EMPLOYEE_ID = 100;
ID NAME JOB_ID SALARY
---------- ---------------------------------------------- ---------- ----------
100 King Steven AD_PRES 72000
Buscando informações do passado com AS OF:
SQL> SELECT EMPLOYEE_ID as ID, LAST_NAME||' '||FIRST_NAME as Name, JOB_ID, SALARYAtravés do flashback table voltamos os dados ao original:
FROM hr.employees AS OF TIMESTAMP TO_TIMESTAMP('26/08/2009 21:39:15', 'DD/MM/YYYY hh24:mi:ss')
WHERE employee_id = 100;
2 3
ID NAME JOB_ID SALARY
---------- ---------------------------------------------- ---------- ----------
100 King Steven AD_PRES 24000
SQL> SELECT LAST_NAME, SALARY FROM HR.EMPLOYEES
VERSIONS BETWEEN TIMESTAMP
TO_TIMESTAMP ('26/08/2009 21:39:15', 'DD/MM/YYYY hh24:mi:ss')
AND
TO_TIMESTAMP ('26/08/2009 21:44:15', 'DD/MM/YYYY hh24:mi:ss')
WHERE EMPLOYEE_ID = 100; 2 3 4 5 6
LAST_NAME SALARY
------------------------- ----------
King 72000
King 24000
SQL> ALTER TABLE HR.EMPLOYEES ENABLE ROW MOVEMENT;Referencias:
Table altered.
SQL> FLASHBACK TABLE HR.EMPLOYEES
TO TIMESTAMP
TO_TIMESTAMP ('26/08/2009 21:39:15', 'DD/MM/YYYY hh24:mi:ss'); 2 3
Flashback complete.
SQL> select EMPLOYEE_ID as ID, LAST_NAME||' '||FIRST_NAME as Name, JOB_ID, SALARY from HR.employees where EMPLOYEE_ID = 100;
ID NAME JOB_ID SALARY
---------- ---------------------------------------------- ---------- ----------
100 King Steven AD_PRES 24000
http://www.orafaq.com/wiki/Oracle_Total_Recall
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_5009.htm
http://www.oracle-base.com/articles/11g/FlashbackAndLogminerEnhancements_11gR1.php
http://www.oracle-base.com/articles/11g/FlashbackAndLogminerEnhancements_11gR1.php
http://www.psoug.org/reference/flash_archive.html
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/statements_9013.htm#SQLRF01603