GreysitoErPutoAmo

PL/SQL - AC triggers

May 25th, 2015
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 4.15 KB | None | 0 0
  1. --Escribe un disparador de base de datos que permita
  2. --auditar las operaciones de inserción o borrado de
  3. --datos que se realicen en la tabla EMPLE según las
  4. --siguientes especificaciones:
  5. --– Se creará desde SQL*Plus la tabla auditaremple con la
  6. --columna col1 VARCHAR2(200).
  7. -- Cuando se produzca cualquier manipulación, se insertará
  8. --una fila en dicha tabla que contendrá: fecha y
  9. --hora, número de empleado, apellido y la operación de
  10. --actualización INSERCIÓN o BORRADO.
  11.  
  12. CREATE TABLE auditaremple (
  13.         col1 VARCHAR2(200)
  14. );
  15.  
  16. CREATE OR REPLACE TRIGGER auditar_act_emp
  17.         BEFORE INSERT OR DELETE
  18.         ON EMPLE
  19.         FOR EACH ROW
  20. BEGIN
  21.         IF DELETING THEN
  22.                 INSERT INTO AUDITAREMPLE
  23.                 VALUES(TO_CHAR(SYSDATE,'DD/MM/YY*HH24:MI*')
  24.                         || :OLD.EMP_NO|| '*' || :OLD.APELLIDO || '* BORRADO ');
  25. ELSIF INSERTING THEN
  26.                 INSERT INTO AUDITAREMPLE
  27.                 VALUES(TO_CHAR(SYSDATE,'DD/MM/YY*HH24:MI*')
  28.                         || :NEW.EMP_NO || '*' || :NEW.APELLIDO||'* INSERCION ');
  29.         END IF;
  30. END;
  31.  
  32. --Escribe un trigger que permita auditar las modificaciones
  33. --en la tabla EMPLEADOS, insertando los siguientes
  34. --datos en la tabla auditaremple: fecha y hora, número de
  35. --empleado, apellido, la operación de actualización MODIFICACIÓN
  36. --y el valor anterior y el valor nuevo de cada
  37. --columna modificada (sólo en las columnas modificadas).
  38.  
  39. CREATE OR REPLACE TRIGGER audit_modif
  40.         BEFORE UPDATE ON EMPLE
  41.         FOR EACH ROW
  42. DECLARE
  43.         v_cad_inser auditaremple.col1%TYPE;
  44. BEGIN
  45.         v_cad_inser := TO_CHAR(SYSDATE,'DD/MM/YY*HH24:MI*') ||:OLD.EMP_NO ||'* MODIFICACION *';
  46.  
  47. IF UPDATING ('EMP_NO') THEN
  48.         v_cad_inser := v_cad_inser
  49.         ||:OLD.EMP_NO|| '*'|| :NEW.EMP_NO;
  50. END IF;
  51.  
  52. IF UPDATING ('APELLIDO') THEN
  53.         v_cad_inser := v_cad_inser
  54.         ||:OLD.APELLIDO|| '*'||:NEW.APELLIDO;
  55. END IF;
  56.  
  57. IF UPDATING ('OFICIO') THEN
  58.         v_cad_inser := v_cad_inser
  59.         ||:OLD.OFICIO|| '*'||:NEW.OFICIO;
  60. END IF;
  61.  
  62. IF UPDATING ('DIR') THEN
  63.         v_cad_inser := v_cad_inser
  64.         ||:OLD.DIR|| '*'||:NEW.DIR;
  65. END IF;
  66.  
  67. IF UPDATING ('FECHA_ALT') THEN
  68.         v_cad_inser := v_cad_inser
  69.         ||:OLD.FECHA_ALT||:NEW.FECHA_ALT;
  70. END IF;
  71.  
  72. IF UPDATING ('SALARIO') THEN
  73.         v_cad_inser := v_cad_inser
  74.         ||:OLD.SALARIO|| '*'||:NEW.SALARIO;
  75. END IF;
  76.  
  77. IF UPDATING ('COMISION') THEN
  78.         v_cad_inser := v_cad_inser
  79.         ||:OLD.COMISION|| '*'||:NEW.COMISION;
  80. END IF;
  81.  
  82. IF UPDATING ('DEPT_NO') THEN
  83.         v_cad_inser := v_cad_inser
  84.         ||:OLD.DEPT_NO|| '*'||:NEW.DEPT_NO;
  85. END IF;
  86.  
  87. INSERT INTO AUDITAREMPLE VALUES(v_cad_inser);
  88. END;
  89.  
  90. --Suponiendo que disponemos de la vista:
  91.  
  92. CREATE VIEW DEPARTAM AS
  93. SELECT DEPART.DEPT_NO, DNOMBRE, LOC,
  94. COUNT(EMP_NO) TOT_EMPLE
  95. FROM EMPLE, DEPART
  96. WHERE EMPLE.DEPT_NO (+) =
  97. DEPART.DEPT_NO
  98. GROUP BY DEPART.DEPT_NO, DNOMBRE, LOC;
  99.  
  100. --Construye un disparador que permita realizar actualizaciones
  101. --en la tabla depart a partir de la vista departam,
  102. --de forma similar al ejemplo del trigger t_ges_emplead. Se
  103. --contemplarán las siguientes operaciones:
  104. -- Insertar y borrar departamento.
  105. -- Modificar la localidad de un departamento.
  106.  
  107. CREATE OR REPLACE TRIGGER ges_depart
  108.         INSTEAD OF DELETE OR INSERT OR UPDATE
  109.         ON DEPARTAM
  110.         FOR EACH ROW
  111. BEGIN
  112.         IF DELETING THEN
  113.                 DELETE FROM depart WHERE dept_no = :old.dept_no;
  114.         ELSIF INSERTING THEN
  115.                 INSERT INTO depart
  116.                 VALUES(:NEW.dept_no, :NEW.dnombre, :NEW.loc);
  117.         ELSIF UPDATING('loc') THEN
  118.                 UPDATE depart SET loc = :NEW.loc
  119.                 WHERE dept_no = :old.dept_no;
  120.         ELSE
  121.                 RAISE_APPLICATION_ERROR
  122.                 (-20001,'Error en la actualización');
  123.         END IF;
  124. END;
  125.         INSERT INTO AUDITAREMPLE
  126.         VALUES(TO_CHAR(SYSDATE,'DD/MM/YY*HH24:MI*')
  127.             || :OLD.EMP_NO|| '*' || :OLD.APELLIDO || '* BORRADO ');
  128. ELSIF INSERTING THEN
  129.         INSERT INTO AUDITAREMPLE
  130.         VALUES(TO_CHAR(SYSDATE,'DD/MM/YY*HH24:MI*')
  131.             || :NEW.EMP_NO || '*' || :NEW.APELLIDO||'* INSERCION ');
  132.     END IF;
  133. END;
Add Comment
Please, Sign In to add comment