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.
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
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.
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
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