Ejercicios de triggers

Solo disponible en BuenasTareas
  • Páginas : 8 (1755 palabras )
  • Descarga(s) : 0
  • Publicado : 13 de febrero de 2012
Leer documento completo
Vista previa del texto
EJERCICIOS DE TRIGGERS

1.- Una empresa almacena los datos de sus empleados en una tabla denominada "empleados". En una tabla denominada "controlCambios" guarda los cambios que se realizan en la tabla "empleados", en ella almacena el nombre del usuario que realiza la modificación, la fecha, el valor anterior del campo modificado y el nuevo valor. Creamos las tablas, con las siguientesestructuras:
create table empleados( documento char(8) not null, nombre varchar2(30) not null, domicilio varchar2(30), seccion varchar2(20) ); create table controlCambios( usuario varchar2(30), fecha date, datoanterior varchar2(30), datonuevo varchar2(30) );

Ingresamos algunos registros:
insert into empleados values('22222222','Ana Acosta','Bulnes 56','Secretaria'); insert into empleadosvalues('23333333','Bernardo Bustos','Bulnes 188','Contaduria'); insert into empleados values('24444444','Carlos Caseres','Caseros 364','Sistemas'); insert into empleados values('25555555','Diana Duarte','Colon 1234','Sistemas'); insert into empleados values('26666666','Diana Duarte','Colon 897','Sistemas'); insert into empleados values('27777777','Matilda Morales','Colon 542','Gerencia');

Creamos undisparador que se active cuando modificamos algún campo de "empleados" y almacene en "controlCambios" el nombre del usuario que realiza la actualización, la fecha, el dato que se cambia y el nuevo valor:
create or replace trigger tr_actualizar_empleados before update on empleados for each row begin if updating('documento') then insert into controlCambios values(user,sysdate, :old.documento,:new.documento); end if; if updating('nombre') then insert into controlCambios values(user,sysdate, :old.nombre, :new.nombre); end if; if updating('domicilio') then insert into controlCambios values(user,sysdate, :old.domicilio, :new.domicilio); end if; if updating('seccion') then insert into controlCambios values(user,sysdate, :old.seccion, :new.seccion); end if; end tr_actualizar_empleados;

Creamos otrodesencadenador que se active cuando ingresamos un nuevo registro en "empleados", debe almacenar en "controlCambios" el nombre del usuario que realiza el ingreso, la fecha, "null" en "datoanterior" (porque se dispara con una inserción) y en "datonuevo" el documento:
create or replace trigger tr_ingresar_empleados before insert on empleados for each row begin insert into controlCambiosvalues(user,sysdate, null, :new.documento); end tr_ingresar_empleados;

Creamos un tercer trigger sobre "empleados" que se active cuando eliminamos un registro en "empleados", debe almacenar en "controlCambios" el nombre del usuario que realiza la eliminación, la fecha, el documento en "datoanterior" y "null" en "datonuevo":
create or replace trigger tr_eliminar_empleados before delete on empleados foreach row begin insert into controlCambios values(user,sysdate, :old.documento, null); end tr_eliminar_empleados;

Los tres triggers están habilitados. Consultamos el diccionario "user_triggers" para corroborarlo:
select trigger_name, triggering_event, status from user_triggers where trigger_name like 'TR%EMPLEADOS';

Vamos a ingresar un empleado "tr_ingresar_empleados" se dispara"controlCambios":

y comprobar que el trigger recuperando los registros de

insert into empleados values('28888888','Pedro Perez','Peru 374','Secretaria'); select *from controlCambios;

Deshabilitamos el trigger "tr_ingresar_empleados":
alter trigger tr_ingresar_empleados disable;

Consultamos el diccionario "user_triggers" para corroborarlo:
select trigger_name, status from user_triggers wheretrigger_name like 'TR%EMPLEADOS';

El trigger "tr_ingresar_empleados" está deshabilitado, "tr_actualizar_empleados" y "tr_elimnar_empleados" están habilitados.

Vamos a ingresar un empleado y comprobar que el trigger de inserción no se dispara recuperando los registros de "controlCambios":
insert into empleados values('29999999','Rosa Rodriguez','Rivadavia 627','Secretaria'); select *from...
tracking img