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.