jueves, 2 de octubre de 2014

In-Database Archiving en 12c


         Este nuevo feature llamó mi atención por la simplicidad de implementación y la utilidad que tiene cuando necesitamos eliminar filas de una tabla en forma lógica, es decir, sin eliminar la fila en forma física o permanente.  

         Si bien el procedimiento para "ocultar" filas se puede realizar agregando una columna extra de visibilidad como flag, esta nueva columna es parte del modelado y de alguna forma "ensucia" el modelo lógico, aunque a partir de 11g se puede ser mas prolijo y agregar la columna de marca de borrado como oculta. Luego que la columna se agrega o se puede programar en la aplicación para que considere siempre las filas que cumplen por ej:  BORRADA = 'N' o en forma mas transparente usando políticas de seguridad (ej: VPD)

         En esta nota voy a mostrar con un simple ejemplo como usar el archiving interno a nivel de tabla para implementar borrados lógicos:

Voy a crear un tabla T con dos columnas:

SQL> create table t (x int, y varchar2(10));
Table created.

Habilito el archiving en la tabla recién creada:

SQL> alter table t row archival;
Table altered.

Inserto 100 filas:

SQL> insert into t 
  2  select rownum,dbms_random.string('a',10)
  3  from dual
  4  connect by rownum <= 100;
100 rows created.
                 
SQL> commit;
Commit complete.

Cuento la cantidad de filas insertadas:

SQL> select count(1) from t;

  COUNT(1)
----------
       100

Realizo el borrado lógico de 10 filas cualquiera:

SQL> update t set ora_archive_state = '1' where rownum <= 10;
10 rows updated.
             
SQL> commit;
Commit complete.

Verifico que no estén visibles la filas borradas enteriormente:



SQL> select count(1) from t;
         
 COUNT(1)
----------
        90

Si se quiere tener visibilidad de todas las filas, incluidas las eliminadas, hay que setear el siguiente parámetro a nivel sesión:

SQL> ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ALL;
Session altered.
         
SQL> select count(1) from t;
  COUNT(1)
----------
       100

Como se observa con el count(*) se suman también las filas ocultas.

Para volver a hacer invisibles las filas:

ALTER SESSION SET ROW ARCHIVAL VISIBILITY = ACTIVE;

Si, por ejemplo, se eliminaron mas filas que las necesarias, simplemente hay que realizar un update sobre la pseudocolumna  ora_archive_state en 0, que es el valor default.

Para desactivar el row archiving:

SQL> alter table t no row archival;
Table altered.