105 - Disparador de inserción a nivel de sentencia


Problema:

Una librería almacena los datos de sus libros en una tabla denominada "libros" y controla las acciones que los empleados realizan sobre dicha tabla almacenando en la tabla "control" el nombre del usuario y la fecha, cada vez que se ingresa un registro en la tabla "libros".

Eliminamos la tabla:

 drop table libros;

Creamos la tabla con la siguiente estructura:

 create table libros(
  codigo number(6),
  titulo varchar2(40),
  autor varchar2(30),
  precio number(6,2)
 );

Creamos la tabla "control", antes la eliminamos:

 drop table control;
 create table control(
  usuario varchar2(30),
  fecha date
 );

Creamos un disparador que se dispare cada vez que se ingrese un registro en "libros"; el trigger debe ingresar en la tabla "control", el nombre del usuario, la fecha y la hora en la cual se realizó un "insert" sobre "libros":

 create or replace trigger tr_ingresar_libros
  before insert
  on libros
 begin
  insert into Control values(user,sysdate);
 end tr_ingresar_libros;
 /

Establecemos el formato de fecha para que muestre "DD/MM/YYYY HH24:MI":

 alter session set NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI';

Veamos qué nos informa el diccionario "user_triggers" respecto del trigger anteriormente creado:

 select *from user_triggers where trigger_name ='TR_INGRESAR_LIBROS';

obtenemos la siguiente información:

- trigger_name: nombre del disparador;

- trigger_type: momento y nivel, en este caso es un desencadenador "before" y a nivel de sentencia (statement);

- triggering_event: evento que lo dispara, en este caso, "insert";

- base_object_type: a qué objeto está asociado, puede ser una tabla o una vista, en este caso, una tabla (table);

- table_name: nombre de la tabla al que está asociado (libros);

- y otras columnas que no analizaremos por el momento.

Ingresamos un registro en "libros":

 insert into libros values(100,'Uno','Richard Bach',25);

Verificamos que el trigger se disparó consultando la tabla "control" para ver si tiene un nuevo registro:

 select *from control;

Ingresamos dos registros más en "libros":

 insert into libros values(150,'Matematica estas ahi','Paenza',12);
 insert into libros values(185,'El aleph','Borges',42);

Verificamos que el trigger se disparó consultando la tabla "control" para ver si tiene dos nuevos registros:

 select *from control;

Ingresemos el siguiente lote de comandos en el Oracle SQL Developer:

 drop table libros;

 create table libros(
  codigo number(6),
  titulo varchar2(40),
  autor varchar2(30),
  precio number(6,2)
 );

 drop table control;
 create table control(
  usuario varchar2(30),
  fecha date
 );

 -- Creamos un disparador que se dispare cada vez que se ingrese un registro en "libros";
 -- el trigger debe ingresar en la tabla "control", el nombre del usuario, la fecha
 -- y la hora en la cual se realizó un "insert" sobre "libros":
 create or replace trigger tr_ingresar_libros
  before insert
  on libros
 begin
  insert into Control values(user,sysdate);
 end tr_ingresar_libros;
 /
 
 -- Establecemos el formato de fecha para que muestre "DD/MM/YYYY HH24:MI":
 alter session set NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI';

 -- Veamos qué nos informa el diccionario "user_triggers" respecto del trigger anteriormente creado:
 select *from user_triggers where trigger_name ='TR_INGRESAR_LIBROS';

 insert into libros values(100,'Uno','Richard Bach',25);

 -- Verificamos que el trigger se disparó consultando la tabla "control"
 -- para ver si tiene un nuevo registro:
 select * from control;

 -- Ingresamos dos registros más en "libros":
 insert into libros values(150,'Matematica estas ahi','Paenza',12);
 insert into libros values(185,'El aleph','Borges',42);

 -- Verificamos que el trigger se disparó consultando la tabla "control" para ver si tiene
 -- dos nuevos registros:
 select * from control;

La ejecución de este lote de comandos SQL genera una salida similar a:

SQL Developer disparador


Retornar