miércoles, 2 de julio de 2014

TAREA 9: TRIGGERS


Existen varios tipos de disparadores, dependiendo del tipo de transacción de disparo y el nivel en el que se ejecuta el disparador (trigger):

1.- Disparadores de nivel de fila: se ejecutan una vez para cada fila afectada por una instrucción DML. Los disparadores de nivel de fila se crean utilizando la cláusula for each row en el comando create trigger.

2.- Disparadores de nivel de instrucción: se ejecutan una vez para cada intrucción DML. Por ejemplo, si una única intrucción INSERT inserta 500 filas en una tabla un disparador de nivel de instrucción para dicha tabla sólo se ejecutará una vez. Los disparadores de nivel de instrucción son el tipo predeterminado que se crea con el comando create trigger.

3.- Disparadores Before y After: puesto que los disparadores son ejecutados por sucesos, puede establecerse que se produzcan inmediatamente antes (before) o después (after) de dichos sucesos.

4.- Disparadores Instead Of: puede utilizar INSTEAD OF para indicar a Oracle lo que tiene que hacer en lugar de realizar las acciones que invoca el disparador. Por ejemplo, podría usar un disparador INSTEAD OF en una vista para gestionar las inserciones en una tabla o para actualizar múltiples tablas que son parte de una vista.

5.- Disparadores de esquema: puede crear disparadores sobre operaciones en el nivel de esquema tales como create table, alter table, drop table, audit, rename, truncate y revoke. Puede incluso crear disparadores para impedir que los usuarios eliminen sus propias tablas. En su mayor parte, los disparadores de nivel de esquema proporcionan dos capacidades: impedir operaciones DDL y proporcionar una seguridad adicional que controle las operaciones DDL cuando éstar se producen.

6.- Disparadores en nivel de base de datos: puede crear disparadores que se activen al producirse sucesos de la base de datos, incluyendo errores, inicios de sesión, conexiones y desconexiones. Puede utilizar este tipo de disparador para automatizar el mantenimiento de la base de datos o las acciones de auditoría.

Ejemplo:


Creamos un Trigger que se ejecute cada vez que en la tabla departments sea modificado el manager_id, osea cuando cambia el encargado del area de ese departamento, y se guarda un historial de los cambios de encargado del departamento y cuando fue designado a ese cargo.
Ademas se crea la tabla en la que se guardarán los datos del historial.

CREATE OR REPLACE TABLE MANAGER_HISTORY(
DEPARTMENT_ID NUMBER(4)
CONSTRAINT MAN_HIST_DEP_FK REFERENCES
departments(department_id)
,MANAGER_ID NUMBER(6)
CONSTRAINT MAN_HIST_MAN_FK REFERENCES
employees ON DELETE SET NULL
,DATE_UPDATE DATE
CONSTRAINT MAN_DATE_UPDATE NOT NULL)
;

TRIGGER CAMBIO_MANAGER_DEPT
AFTER UPDATE OF MANAGER_ID ON DEPARTMENTS
REFERENCING OLD AS OLD
FOR EACH ROW
BEGIN
INSERT INTO MANAGER_HISTORY(DEPARTMENT_ID,
MANAGER_ID, DATE_UPDATE) VALUES (:OLD.DEPARTMENT_ID,
:OLD.MANAGER_ID, SYSDATE);
END;



REFERENCIA: http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=178

No hay comentarios.:

Publicar un comentario