DAI-C8-EC: Triggers, exercicis proposats

De wikijoan
Salta a la navegació Salta a la cerca

Objectius

Unitat Didàctica: UD 5. Triggers

Després de fer i entendre els exercicis comentats a classe, l'alumne ja està en disposició de programar triggers i resoldre exercicis concrets a partir d'un enunciat.

Desenvolupament

Realitza els següents exercicis:

1. Construir un disparador de base de datos que permita auditar las operaciones de inserción o borrado de datos que se realicen en la tabla emple según las siguientes especificaciones:

  • En primer lugar se creará desde SQL*Plus la tabla auditaremple con la columna col1 VARCHAR2(200).
  • Cuando se produzca cualquier manipulación se insertará una fila en dicha tabla que contendrá:
  • Fecha y hora
  • Número de empleado
  • Apellido
  • La operación de actualización INSERCIÓN o BORRADO

2. Escribir un trigger de base de datos un que permita auditar las modificaciones en la tabla empleados insertado en la tabla auditaremple los siguientes datos:

  • Fecha y hora
  • Número de empleado
  • Apellido
  • La operación de actualización: MODIFICACIÓN.
  • El valor anterior y el valor nuevo de cada columna modificada. (solo las columnas modificadas)

3. Escribir un disparador de base de datos que haga fallar cualquier operación de modificación del apellido o del número de un empleado, o que suponga una subida de sueldo superior al 10%.

4. Suponiendo que disponemos de la vista

CREATE VIEW DEPARTAM AS
SELECT DEPART.DEPT_NO, DNOM, LOC, COUNT(EMP_NO) TOT_EMPLE  
FROM EMPLE, DEPART
WHERE EMPLE.DEPT_NO (+) = DEPART.DEPT_NO
GROUP BY DEPART.DEPT_NO, DNOM, LOC;

Construir un disparador que permita realizar operaciones de actualización en la tabla depart a partir de la vista dptos, de forma similar al ejemplo del trigger t_ges_emplead. Se contemplarán las siguientes operaciones:

  • Insertar departamento.
  • Borrar departamento.
  • Modificar la localidad de un departamento.

solucions

<toggledisplay> 1. Construir un disparador de base de datos que permita auditar las operaciones de inserción o borrado de datos que se realicen en la tabla emple según las siguientes especificaciones:

  • En primer lugar se creará desde SQL*Plus la tabla auditaremple con la columna col1 VARCHAR2(200).
  • Cuando se produzca cualquier manipulación se insertará una fila en dicha tabla que contendrá:
  • Fecha y hora
  • Número de empleado
  • Apellido
  • La operación de actualización INSERCIÓN o BORRADO
CREATE TABLE auditaremple (camp1 VARCHAR2(255));

CREATE OR REPLACE TRIGGER auditar_act_emp
   BEFORE INSERT OR DELETE
   ON EMPLE
   FOR EACH ROW
BEGIN
   IF DELETING THEN
     INSERT INTO AUDITAREMPLE
 VALUES(TO_CHAR(sysdate,'DD/MM/YY*HH24:MI*') 
 || :OLD.EMP_NO|| '*' || :OLD.COGNOM || '* ELIMINAT ');
   ELSIF INSERTING THEN
     INSERT INTO AUDITAREMPLE
   	 VALUES(TO_CHAR(sysdate,'DD/MM/YY*HH24:MI*') 
 || :NEW.EMP_NO || '*' || :NEW.COGNOM ||'* INSERIT ');
   END IF;
END;
/

2. Escribir un trigger de base de datos un que permita auditar las modificaciones en la tabla empleados insertado en la tabla auditaremple los siguientes datos:

  • Fecha y hora
  • Número de empleado
  • Apellido
  • La operación de actualización: MODIFICACIÓN.
  • El valor anterior y el valor nuevo de cada columna modificada. (solo las columnas modificadas)
CREATE OR REPLACE TRIGGER audit_modif
  	BEFORE UPDATE  ON EMPLE
  	FOR EACH ROW 
DECLARE
	v_cad_inser auditaremple.camp1%TYPE;
BEGIN
v_cad_inser := TO_CHAR(sysdate,'DD/MM/YY*HH24:MI*') ||:OLD.EMP_NO ||'* MODIFICACIÓ *';

    	IF UPDATING ('EMP_NO') THEN		
  	v_cad_inser := v_cad_inser ||:OLD.EMP_NO|| '*'|| :NEW.EMP_NO;
	END IF;

	IF UPDATING ('COGNOM') THEN		
    	v_cad_inser := v_cad_inser ||:OLD.COGNOM|| '*'||:NEW.COGNOM;
	END IF;

	IF UPDATING ('OFICI') THEN		
	   	v_cad_inser := v_cad_inser ||:OLD.OFICI|| '*'||:NEW.OFICI;
	END IF;

	IF UPDATING ('DIR') THEN		
	v_cad_inser := v_cad_inser ||:OLD.DIR|| '*'||:NEW.DIR;
	END IF;

	IF UPDATING ('DATA_ALT') THEN		
	v_cad_inser := v_cad_inser || :OLD.DATA_ALT||:NEW.DATA_ALT;
	END IF;

	IF UPDATING ('SALARI') THEN		
		v_cad_inser := v_cad_inser || :OLD.SALARI || '*'||:NEW.SALARI;
	END IF;

	IF UPDATING ('COMISSIO') THEN		
	    v_cad_inser := v_cad_inser ||:OLD.COMISSIO || '*'||:NEW.COMISSIO;
	END IF;

	IF UPDATING ('DEPT_NO') THEN		
	    v_cad_inser := v_cad_inser ||:OLD.DEPT_NO|| '*'||:NEW.DEPT_NO;
	END IF;
	
	INSERT INTO AUDITAREMPLE VALUES(v_cad_inser);
END;
/

3. Escribir un disparador de base de datos que haga fallar cualquier operación de modificación del apellido o del número de un empleado, o que suponga una subida de sueldo superior al 10%.

CREATE OR REPLACE TRIGGER errada_modif
	BEFORE UPDATE OF cognom, emp_no, salari
	ON emple
	FOR EACH ROW
BEGIN
	IF UPDATING('emp_no') OR UPDATING('cognom') OR (UPDATING ('salari')  AND :new.salari>:old.salari*1.1) THEN
	   RAISE_APPLICATION_ERROR (-20001,'Err. Modificació no permesa');
	END IF;
END;
/

/* NOTA: teniendo en cuenta los eventos que producirán el disparo del trigger la condición se puede resumir:  
IF NOT UPDATING ('salario') OR :new.salario > :old.salario*1.1
THEN ...
*/

4. Suponiendo que disponemos de la vista

CREATE VIEW DEPARTAM AS
SELECT DEPART.DEPT_NO, DNOM, LOC, COUNT(EMP_NO) TOT_EMPLE  
FROM EMPLE, DEPART
WHERE EMPLE.DEPT_NO (+) = DEPART.DEPT_NO
GROUP BY DEPART.DEPT_NO, DNOM, LOC;

Construir un disparador que permita realizar operaciones de actualización en la tabla depart a partir de la vista dptos, de forma similar al ejemplo del trigger t_ges_emplead. Se contemplarán las siguientes operaciones:

  • Insertar departamento.
  • Borrar departamento.
  • Modificar la localidad de un departamento.
CREATE OR REPLACE TRIGGER ges_depart
	INSTEAD OF DELETE OR INSERT OR UPDATE
	ON DEPARTAM
	FOR EACH ROW
BEGIN
	IF DELETING THEN
	  	DELETE FROM depart WHERE dept_no = :old.dept_no;
	ELSIF INSERTING THEN
		INSERT INTO depart VALUES(:new.dept_no, :new.dnom, :new.loc);
	ELSIF UPDATING('loc') THEN
		UPDATE depart SET loc = :new.loc WHERE dept_no = :old.dept_no;
	ELSE
	   RAISE_APPLICATION_ERROR (-20001,'Error en la actualizació');
	END IF;
END;
/

</toggledisplay>

Entrega

  • entregar els fitxers DAI2AXX_script_NA8.sql i DAI2AXX_NA8.log. Si has treballat per parelles: DAI2AXXXX_script_NA8.sql i DAI2AXXXX_NA8.log, indicant a dins clarament el nom i el número de classe (comentaris amb REM). Exercici individual o per parelles.
  • entregar al Moodle: http://192.168.0.15/moodle

Recursos

En el Moodle també pots descarregar el codi per crear les taules, i el codi que s'ha vist a classe.

Durarda

2 hores



creat per Joan Quintana Compte, octubre 2009