110 - Disparador de actualización - lista de campos (update trigger) |
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 modifica el "precio" de un libro.
Eliminamos las tablas:
drop table control; drop table libros;
Creamos las tablas con las siguientes estructuras:
create table libros( codigo number(6), titulo varchar2(40), autor varchar2(30), editorial varchar2(20), precio number(6,2) ); create table control( usuario varchar2(30), fecha date );
Ingresamos algunos registros en "libros":
insert into libros values(100,'Uno','Richard Bach','Planeta',25); insert into libros values(103,'El aleph','Borges','Emece',28); insert into libros values(105,'Matematica estas ahi','Paenza','Nuevo siglo',12); insert into libros values(120,'Aprenda PHP','Molina Mario','Nuevo siglo',55); insert into libros values(145,'Alicia en el pais de las maravillas','Carroll','Planeta',35);
Establecemos el formato de fecha para que muestre "DD/MM/YYYY HH24:MI":
alter session set NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI';
Creamos un desencadenador a nivel de fila que se dispare cada vez que se actualiza el campo "precio"; el trigger debe ingresar en la tabla "control", el nombre del usuario, la fecha y la hora en la cual se realizó un "update" sobre "precio" de "libros":
create or replace trigger tr_actualizar_precio_libros before update of precio on libros for each row begin insert into control values(user,sysdate); end tr_actualizar_precio_libros; /
Veamos qué nos informa el diccionario "user_triggers" respecto del trigger anteriormente creado:
select *from user_triggers where trigger_name ='TR_ACTUALIZAR_PRECIO_LIBROS';
Aumentamos en un 10% el precio de todos los libros de editorial "Nuevo siglo':
update libros set precio=precio+precio*0.1 where editorial='Nuevo siglo';
Veamos cuántas veces se disparó el trigger consultando la tabla "control":
select *from control;
El trigger se disparó 2 veces, una vez por cada registro modificado en "libros". Si el trigger hubiese sido creado a nivel de sentencia, el "update" anterior hubiese disparado el trigger 1 sola vez aún cuando se modifican 2 filas.
Modificamos otro campo, diferente de "precio":
update libros set autor='Lewis Carroll' where autor='Carroll';
Veamos si el trigger se disparó consultando la tabla "control":
select *from control;
El trigger no se disparó (no hay nuevas filas en "control"), pues está definido solamente sobre el campo "precio".
drop table control; drop table libros; create table libros( codigo number(6), titulo varchar2(40), autor varchar2(30), editorial varchar2(20), precio number(6,2) ); create table control( usuario varchar2(30), fecha date ); insert into libros values(100,'Uno','Richard Bach','Planeta',25); insert into libros values(103,'El aleph','Borges','Emece',28); insert into libros values(105,'Matematica estas ahi','Paenza','Nuevo siglo',12); insert into libros values(120,'Aprenda PHP','Molina Mario','Nuevo siglo',55); insert into libros values(145,'Alicia en el pais de las maravillas','Carroll','Planeta',35); alter session set NLS_DATE_FORMAT = 'DD/MM/YYYY HH24:MI'; create or replace trigger tr_actualizar_precio_libros before update of precio on libros for each row begin insert into control values(user,sysdate); end tr_actualizar_precio_libros; / select *from user_triggers where trigger_name ='TR_ACTUALIZAR_PRECIO_LIBROS'; update libros set precio=precio+precio*0.1 where editorial='Nuevo siglo'; select *from control; update libros set autor='Lewis Carroll' where autor='Carroll'; select *from control;