UNIVERSIDAD DE LAS AMÉRICAS PUEBLA“Triggers”Dr.José Luis Zechinelli MartiniIntegrantesDavid Águila Valencia ID 141026Luis ...
ResumenSe ejecutaron y compilaron una serie de instrucciones junto con los “triggers” o“disparadores” en el programa de ba...
Al ejecutar las pruebas paso lo siguiente:INSERT INTO deptoVALUES(1, uno, puebla, 0);Esto nos da un error debido a que la ...
En esta prueba la inserción fue llevada a cabo correctamentedebido a que la localización insertada fue “parís” y esta dent...
Se crea el trigger siguienteCREATE TRIGGER t1BEFORE UPDATE ON employeeFOR EACH ROWBEGIN:new.datemaj := sysdate;END;Antes d...
insert into employee values(7938,martin,ENSEIGe, 7566,30-JUN-98, „KRONOS‟, 90);dando como resultado el siguiente:Se compil...
Se ve que al agregar los dos empleados de las siguientes instruccionesinsert into employee values(7935, VARGAS, ANALYST, 7...
creación de un nuevo departamentoCreación de un empleado con el departamento “80”Al eliminar el departamento con el numero...
RAISE_APPLICATION_ERROR(-20000,Numerodepartementinvalide || TO_CHAR(:new.deptnum));CLOSE dummy_cursor;WHEN valid_departmen...
Se agrego el departamento no 81, que tiene 1 numero de empleados, al ejecutar lasiguiente instrucción:deletedepto where de...
Para el siguiente trigger se creo la siguiente tabla:Y en trigger siguienteCREATE TRIGGER t10BEFORE INSERT OR UPDATE OF sa...
El siguiente trigger lo que hace es que no se puede modificar, insertar, o actualizarinformación fuera de horas de trabajo...
Próxima SlideShare
Cargando en…5
×

Triggers en SQL

664 visualizaciones

Publicado el

Ejercicios e intrucciones de algunos triggers en la base de datos de Oracle

Publicado en: Tecnología
0 comentarios
1 recomendación
Estadísticas
Notas
  • Sé el primero en comentar

Sin descargas
Visualizaciones
Visualizaciones totales
664
En SlideShare
0
De insertados
0
Número de insertados
3
Acciones
Compartido
0
Descargas
41
Comentarios
0
Recomendaciones
1
Insertados 0
No insertados

No hay notas en la diapositiva.

Triggers en SQL

  1. 1. UNIVERSIDAD DE LAS AMÉRICAS PUEBLA“Triggers”Dr.José Luis Zechinelli MartiniIntegrantesDavid Águila Valencia ID 141026Luis Alejandro Lazcano Gonzales ID140384Edgar Jair Gutiérrez Granados ID 140851Primavera 2013
  2. 2. ResumenSe ejecutaron y compilaron una serie de instrucciones junto con los “triggers” o“disparadores” en el programa de bases de datos de Orcacle (Oracle sqldeveloper) con elfin de entender y comprender de qué manera se crean los triggers y distinguir lasrestricciones que pueden tenerse en una base de datos.IntroducciónEl disparador o triggeres una unidad de PL / SQL que se almacena en la base de datos y(si está activado o desactivado), se ejecuta automáticamente en respuesta a un eventoespecificado.Los disparadores tienen la siguiente estructura:TRIGGER nombre_del_triggertriggering_evento[restricción_del_trigger]BEGINaccion_del_trigger;END;Nombre_del_trigger, debe de ser único, no debe de haber dos disparadores con unmismo nombre, en caso de que lo haya, mandara un mensaje de error diciéndote que elnombre con ese disparador ya fue creado o compilado.Triggering_evento, aquí ira sobre que base de datos funcionara para activar lasiguiente instruccion.Acción_del_trigger, aquí van las instrucciones de lo que hara nuestro disparador encaso de que la restricción sea o no valida, las acciones van a manipular nuestros datos.ResultadosPara la practica se ejecutaron las instrucciones de “schema1.sql” en Oracle sqldeveloperdándonos las siguiente tablas:
  3. 3. Al ejecutar las pruebas paso lo siguiente:INSERT INTO deptoVALUES(1, uno, puebla, 0);Esto nos da un error debido a que la ciudad de puebla no estadada por alta previamente, y solo acepta las ciudades de“parís”,”grenoble” y “lyon”INSERT INTO deptoVALUES(1, uno, paris, 0);
  4. 4. En esta prueba la inserción fue llevada a cabo correctamentedebido a que la localización insertada fue “parís” y esta dentrodel rango.INSERT INTO deptoVALUES(2, uno, paris, 0);Esta inserción no se llevara a cabo debido a que ya existe undepartamento con el nombre “uno” y con el nombre de “parís”.Las siguientes instrucciones se llevaran a cabo correctamenteINSERT INTO employee VALUES(1, vargas, enseignant, 1000,11-DEC-98, x, 1);INSERT INTO employee VALUES(2, dupont, secretaire, 1000,11-NOV-98, x, 1);A excepción de la siguienteINSERT INTO employee VALUES(3, dupont, enseignant, 1000,11-NOV-98, x, 2);Yaque el numero „2‟ al final delregistro, noexisteningundepartamento con estenumero, por lo tanto no seinsertaraEn la siguiente instrucción:DELETE depto WHERE deptnum = 1;Se eliminara el departamento con el numero 1, además de que sehará un eliminado de cascada, es decir que cualquier empleadoasociado a este departamento también se eliminara.
  5. 5. Se crea el trigger siguienteCREATE TRIGGER t1BEFORE UPDATE ON employeeFOR EACH ROWBEGIN:new.datemaj := sysdate;END;Antes de insertar un registro en la tabla de empleados se le agrega lafecha actual para cada registro, en la siguiente instrucción se prueba eltrigger:select * from employee;update EMPLOYEE set job = nouvelle where empnum = 7369;select * from employee;Aquí se observa la tabla despues de aplicar las instruccionesDespues de actualizar la tabla, el disparador 1 actualizo la fechaen que se modifico y la instrucción cmabio el trabajo de “Clerk” a“nouvelle”.Al ejecutar el siguiente trigger t2CREATE TRIGGER t2BEFORE INSERT ON employeeFOR EACH ROWWHEN (new.deptnum IS NOT NULL)DECLARE x NUMBER;BEGINSELECT count(*) INTO xFROM depto WHERE deptnum=:new.deptnum;IF x = 0 THEN INSERT INTO deptovalues(:new.deptnum,????,paris,1);END IF;END;Lo que hace es que al no existir un departamento crea uno, se puede ver en la siguienteinstrucción:
  6. 6. insert into employee values(7938,martin,ENSEIGe, 7566,30-JUN-98, „KRONOS‟, 90);dando como resultado el siguiente:Se compila el siguiente triggerCREATE TRIGGER t7AFTER INSERT OR DELETE OR UPDATE OF deptnum ON employeeFOR EACH ROWDECLARE x NUMBER;BEGINIF ((INSERTING) AND :new.deptnum IS NOT NULL) THENSELECT count(*) INTO xFROM depto WHERE deptnum=:new.deptnum;IF x = 0 THEN INSERT INTO deptovalues(:new.deptnum,????,paris,1);ELSE UPDATE depto SET nemp = nemp +1 WHERE deptnum:new.deptnum;END IF;END IF;IF ((DELETING) AND :old.deptnum IS NOT NULL) THENUPDATE depto SET nemp = nemp -1 WHERE deptnum = :old.deptnum;END IF;END;Lo que hace es modificar el numero de la columna “nemp”, se puede ver el resultado en lasiguiente imagen:
  7. 7. Se ve que al agregar los dos empleados de las siguientes instruccionesinsert into employee values(7935, VARGAS, ANALYST, 7566, NULL,KRONOS, 40);insert into employee values(7936, WALTER, ANALYST, 7566, NULL,KRONOS, 20);El siguiente triger ayuda al usuario a modificiar todos los datos de los empleados cuandose modifica el numero del departamento, es decir cambiara el numero del empleado queestaba en ese departamento al mismo numeroCREATE TRIGGER t3AFTER UPDATE OF deptnum ON deptoFOR EACH ROWBEGINIF :old.deptnum != :new.deptnum THENUPDATE employee SET employee.deptnum= :new.deptnumWHERE employee.deptnum= :old.deptnum;END IF;END;Lo que hace el siguiente trigger es que si eliminamos algun departamento, los empleadosque tengan el numero de departamento igual, lo hara “null”CREATE TRIGGER t4BEFORE DELETE ON deptoFOR EACH ROWBEGINUPDATE employee SET employee.deptnum = NULLWHERE employee.deptnum = :old.deptnum;END;Los resultados del trigger 4 fueron los siguientes:
  8. 8. creación de un nuevo departamentoCreación de un empleado con el departamento “80”Al eliminar el departamento con el numero 80, se pone en blanco o en null elnumero de departamento que ya no existe.El siguiente triggerCREATE TRIGGER t5BEFORE INSERT OR DELETE OR UPDATE OF deptnum ON employeeFOR EACH ROWDECLAREdummy INTEGER;emp_present EXCEPTION;emp_non_present EXCEPTION;invalid_department EXCEPTION;valid_departmentEXCEPTION;mutating_table EXCEPTION;CURSOR dummy_cursor (dn NUMBER) ISSELECT deptnumFROM deptoWHERE deptnum = dn;BEGINOPEN dummy_cursor(:new.deptnum);FETCH dummy_cursor INTO dummy;IF dummy_cursor %NOTFOUND THENRAISE invalid_department;ELSE RAISE valid_department;END IF;EXCEPTIONWHEN invalid_department THEN
  9. 9. RAISE_APPLICATION_ERROR(-20000,Numerodepartementinvalide || TO_CHAR(:new.deptnum));CLOSE dummy_cursor;WHEN valid_department THEN CLOSE dummy_cursor;WHEN mutating_table THEN NULL;END;Lo que hara es que si ahora se requiere unsertar un empleado, con un numero dedepartamento, lo que hara es comparar cada numero si existe en la tabla dedepartamentos, si lo encuentra, se insertara, si no, no se insertara nada.Lo que hace el trigger 8 es que ningún departamento que se vaya a suprimir tengapersonas asociadas. Se declaran unos valores para la comparación del mismo.CREATE TRIGGER t8BEFORE DELETE OR UPDATE OF deptnum ON deptoFOR EACH ROWDECLAREdummy INTEGER;emp_present EXCEPTION;emp_non_present EXCEPTION;CURSOR dummy_cursor (dn NUMBER) ISSELECT deptnumFROM employeeWHERE deptnum = dn;BEGINOPEN dummy_cursor(:old.deptnum);FETCH dummy_cursor INTO dummy;IF dummy_cursor %FOUND THENRAISE emp_present;ELSE RAISE emp_non_present;END IF;EXCEPTIONWHEN emp_present THENRAISE_APPLICATION_ERROR(-20001,Empleados en estedepartemento :|| TO_CHAR(:old.deptnum));CLOSE dummy_cursor;WHEN emp_non_present THEN CLOSE dummy_cursor;END;Ejecutando las pruebas se ve lo siguiente:
  10. 10. Se agrego el departamento no 81, que tiene 1 numero de empleados, al ejecutar lasiguiente instrucción:deletedepto where deptnum = 81;nos aparece un mensaje, debido al disparador 8El siguiente disparador funcionara sobre la tabla empleados, cada ves que seponga su salario, el salario no debe de ser menor a 5,000CREATE TRIGGER t9BEFORE UPDATE OF sal ON employeeFOR EACH ROWWHEN (new.sal> 5000)BEGININSERT INTO avert values(employee.empno, employee.sal);END;Ejecutando la siguiente líneaupdate employee set sal = 6000 where empno = 7936;Lo modificara correctamente, sin que nos mencione algun mensaje, en caso sihubiera sido este caso:update employee set sal = 4999 where empno = 7936;Se activa el disparador y no modifica nada.
  11. 11. Para el siguiente trigger se creo la siguiente tabla:Y en trigger siguienteCREATE TRIGGER t10BEFORE INSERT OR UPDATE OF sal ON employeeFOR EACH ROWDECLAREmaxsal NUMBER;x NUMBER;salaire_max EXCEPTION;BEGINIF ( (UPDATING) AND :new.job != MANAGER) THENSELECT sal INTO maxsal FROM dirsalWHERE deptnum = :old.deptnum;IF (:new.sal>= maxsal) THENRAISE salaire_max;END IF;END IF;IF ((UPDATING OR INSERTING) AND :new.job = MANAGER) THENUPDATE dirsal SET sal= :new.sal;END IF;EXCEPTIONWHEN salaire_max THENraise_application_error(-20002,salario ||TO_CHAR(:new.sal) || FF superior al de MANAGER ||TO_CHAR(maxsal) || FF paraempleado || TO_CHAR(:new.empnum));END;Este trigger lo que hace es antes de insertar o actualizar un salario en la tabla deempleados es comparar el salario máximo que tiene cada uno en la tabla DIRSAL, sialguno supera el salario la inserción o actualización no se hace.update employee set sal = 8000 where empnum = 7900;Al ejecutar la prueba, no lo actualizara, debido a que el empleado 7900, es unsecretario, y el secretario no debe de ganar mas de 7839.
  12. 12. El siguiente trigger lo que hace es que no se puede modificar, insertar, o actualizarinformación fuera de horas de trabajo y fines de semana, apareciendo unamodificación no valida.CREATE TRIGGER t12BEFORE INSERT OR DELETE OR UPDATE ON employeeDECLAREweekends EXCEPTION;hora_trabajo EXCEPTION;heure_travail EXCEPTION;BEGINIF( TO_CHAR(SYSDATE,DY) = SAT ORTO_CHAR(SYSDATE,DY) = SUN ) THENRAISE weekends;END IF;IF( TO_CHAR(SYSDATE,HH24) < 12 ORTO_CHAR(SYSDATE,HH24) > 13 ) THENRAISE hora_trabajo;END IF;EXCEPTIONWHEN weekends THENRAISE_APPLICATION_ERROR (-20005,Modificacioninvalidadurante los fines de semana !);WHEN heure_travail THENRAISE_APPLICATION_ERROR (-20006,Modificationinvalidafuera de lashoras de trabajo !);END;

×