sábado, 10 de mayo de 2014

Oracle no Ejecuta un Disparador AFTER DELETE Tras Hacer un Truncate

En este ejemplo, quiero mostrar que Oracle no ejecute un disparador AFTER DELETE después de hacer un TRUNCATE. Lo probé en Oracle 11.2. Para empezar, creé una tabla:

SQL> create table tab1 (my_name varchar2(10))
  2  /

Tabla creada.

SQL>

Luego inserté una fila en la tabla:

SQL> insert into tab1 values ('Andrew')
  2  /

1 fila creada.

SQL> commit
  2  /

Confirmación terminada.

SQL> select * from tab1
  2  /

MY_NAME
----------
Andrew

SQL>

Entonces creé una segunda tabla: 

SQL> create table tab2 (my_name varchar2(10))
  2  /

Tabla creada.

SQL>

Creé un disparador para insertar filas en TAB2 tras borrarlas de TAB1:

SQL> create or replace trigger trig1
  2  after delete on tab1
  3  for each row
  4  begin
  5  insert into tab2 (my_name) values (:old.my_name);
  6  end;
  7  /
 
Disparador creado.


SQL>

Para probar el disparador, empleé un DELETE para borrar la fila de TAB1. La fila apareció en TAB2:

SQL> delete tab1
  2  /

1 fila suprimida.

SQL> select * from tab1
  2  /

ninguna fila seleccionada

SQL> select * from tab2
  2  /

MY_NAME
----------
Andrew

SQL>

Ejecuté un ROLLBACK y la fila volvió de TAB2 a TAB1:

SQL> rollback
  2  /
 
Rollback terminado.
 
SQL> select * from tab1
  2  /
 
MY_NAME
----------
Andrew
 
SQL> select * from tab2
  2  /
 
ninguna fila seleccionada


SQL>

Repetí la prueba con TRUNCATE: 

SQL> truncate table tab1
  2  /
 
Tabla truncada.


SQL>

La fila desapareció de TAB1:

SQL> select * from tab1
  2  /
 
ninguna fila seleccionada


SQL>

... pero Oracle no ejecutó el disparador y la fila no apareció en TAB2:

SQL> select * from tab2
  2  /
 
ninguna fila seleccionada
 

SQL>

... y tras hacer un ROLLBACK, la fila no volvió a TAB1 porque TRUNCATE es DDL y incluye un COMMIT:

SQL> rollback
  2  /
 
Rollback terminado.
 
SQL> select * from tab1
  2  /
 
ninguna fila seleccionada
 
SQL> select * from tab2
  2  /
 
ninguna fila seleccionada
 
SQL> 


En inglés / in English

No hay comentarios:

Publicar un comentario