Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --Escribe 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:
- --– 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 y la operación de
- --actualización INSERCIÓN o BORRADO.
- CREATE TABLE auditaremple (
- col1 VARCHAR2(200)
- );
- 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.APELLIDO || '* BORRADO ');
- ELSIF INSERTING THEN
- INSERT INTO AUDITAREMPLE
- VALUES(TO_CHAR(SYSDATE,'DD/MM/YY*HH24:MI*')
- || :NEW.EMP_NO || '*' || :NEW.APELLIDO||'* INSERCION ');
- END IF;
- END;
- --Escribe un trigger que permita auditar las modificaciones
- --en la tabla EMPLEADOS, insertando los siguientes
- --datos en la tabla auditaremple: fecha y hora, número de
- --empleado, apellido, la operación de actualización MODIFICACIÓN
- --y el valor anterior y el valor nuevo de cada
- --columna modificada (sólo en las columnas modificadas).
- CREATE OR REPLACE TRIGGER audit_modif
- BEFORE UPDATE ON EMPLE
- FOR EACH ROW
- DECLARE
- v_cad_inser auditaremple.col1%TYPE;
- BEGIN
- v_cad_inser := TO_CHAR(SYSDATE,'DD/MM/YY*HH24:MI*') ||:OLD.EMP_NO ||'* MODIFICACION *';
- IF UPDATING ('EMP_NO') THEN
- v_cad_inser := v_cad_inser
- ||:OLD.EMP_NO|| '*'|| :NEW.EMP_NO;
- END IF;
- IF UPDATING ('APELLIDO') THEN
- v_cad_inser := v_cad_inser
- ||:OLD.APELLIDO|| '*'||:NEW.APELLIDO;
- END IF;
- IF UPDATING ('OFICIO') THEN
- v_cad_inser := v_cad_inser
- ||:OLD.OFICIO|| '*'||:NEW.OFICIO;
- END IF;
- IF UPDATING ('DIR') THEN
- v_cad_inser := v_cad_inser
- ||:OLD.DIR|| '*'||:NEW.DIR;
- END IF;
- IF UPDATING ('FECHA_ALT') THEN
- v_cad_inser := v_cad_inser
- ||:OLD.FECHA_ALT||:NEW.FECHA_ALT;
- END IF;
- IF UPDATING ('SALARIO') THEN
- v_cad_inser := v_cad_inser
- ||:OLD.SALARIO|| '*'||:NEW.SALARIO;
- END IF;
- IF UPDATING ('COMISION') THEN
- v_cad_inser := v_cad_inser
- ||:OLD.COMISION|| '*'||:NEW.COMISION;
- 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;
- --Suponiendo que disponemos de la vista:
- CREATE VIEW DEPARTAM AS
- SELECT DEPART.DEPT_NO, DNOMBRE, LOC,
- COUNT(EMP_NO) TOT_EMPLE
- FROM EMPLE, DEPART
- WHERE EMPLE.DEPT_NO (+) =
- DEPART.DEPT_NO
- GROUP BY DEPART.DEPT_NO, DNOMBRE, LOC;
- --Construye un disparador que permita realizar actualizaciones
- --en la tabla depart a partir de la vista departam,
- --de forma similar al ejemplo del trigger t_ges_emplead. Se
- --contemplarán las siguientes operaciones:
- -- Insertar y 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.dnombre, :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ón');
- END IF;
- END;
- INSERT INTO AUDITAREMPLE
- VALUES(TO_CHAR(SYSDATE,'DD/MM/YY*HH24:MI*')
- || :OLD.EMP_NO|| '*' || :OLD.APELLIDO || '* BORRADO ');
- ELSIF INSERTING THEN
- INSERT INTO AUDITAREMPLE
- VALUES(TO_CHAR(SYSDATE,'DD/MM/YY*HH24:MI*')
- || :NEW.EMP_NO || '*' || :NEW.APELLIDO||'* INSERCION ');
- END IF;
- END;
Add Comment
Please, Sign In to add comment