La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

6 Triggers ORACLE - II Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega.

Presentaciones similares


Presentación del tema: "6 Triggers ORACLE - II Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega."— Transcripción de la presentación:

1 6 Triggers ORACLE - II Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega

2 1-2 Cuando se dispara? Opciones BEFORE y AFTEROpciones BEFORE y AFTER Ej. CREATE TRIGGER TR_EST_NOTA BEFORE UPDATE ESTUDIANTE BEFORE: Se dispara antes de que se modifiquen los datosBEFORE: Se dispara antes de que se modifiquen los datos Ej. Decidir si la acción debe realizarse o no AFTER: se dispara una vez se hayan modificado los datosAFTER: se dispara una vez se hayan modificado los datos Opciones BEFORE y AFTEROpciones BEFORE y AFTER Ej. CREATE TRIGGER TR_EST_NOTA BEFORE UPDATE ESTUDIANTE BEFORE: Se dispara antes de que se modifiquen los datosBEFORE: Se dispara antes de que se modifiquen los datos Ej. Decidir si la acción debe realizarse o no AFTER: se dispara una vez se hayan modificado los datosAFTER: se dispara una vez se hayan modificado los datos

3 1-3 Identificadores de correlación OLD y NEWOLD y NEW Tipo especial de variable PL/SQL tratada como un registro de tipo tabla_modificada%ROWTYPETipo especial de variable PL/SQL tratada como un registro de tipo tabla_modificada%ROWTYPE Con OLD.nombre_columna referenciamos: Con OLD.nombre_columna referenciamos: Al valor que tenía la columna antes del cambio debido a una modificación (UPDATE) Al valor de una columna antes de una operación de borrado sobre la misma (DELETE) Al valor NULL para operaciones de inserción (INSERT) OLD y NEWOLD y NEW Tipo especial de variable PL/SQL tratada como un registro de tipo tabla_modificada%ROWTYPETipo especial de variable PL/SQL tratada como un registro de tipo tabla_modificada%ROWTYPE Con OLD.nombre_columna referenciamos: Con OLD.nombre_columna referenciamos: Al valor que tenía la columna antes del cambio debido a una modificación (UPDATE) Al valor de una columna antes de una operación de borrado sobre la misma (DELETE) Al valor NULL para operaciones de inserción (INSERT)

4 1-4 Identificadores de correlación Con NEW.nombre_columna referenciamos:Con NEW.nombre_columna referenciamos: Al valor de una nueva columna después de una operación de inserción (INSERT) Al valor de una columna después de modificarla mediante una sentencia de modificación (UPDATE) Al valor NULL para una operación de borrado (DELETE) OLD y NEW están disponibles siempre y cuando se especifique que el trigger se dispara a nivel de fila (FOR EACH ROW)OLD y NEW están disponibles siempre y cuando se especifique que el trigger se dispara a nivel de fila (FOR EACH ROW) Con NEW.nombre_columna referenciamos:Con NEW.nombre_columna referenciamos: Al valor de una nueva columna después de una operación de inserción (INSERT) Al valor de una columna después de modificarla mediante una sentencia de modificación (UPDATE) Al valor NULL para una operación de borrado (DELETE) OLD y NEW están disponibles siempre y cuando se especifique que el trigger se dispara a nivel de fila (FOR EACH ROW)OLD y NEW están disponibles siempre y cuando se especifique que el trigger se dispara a nivel de fila (FOR EACH ROW)

5 1-5 Ejemplos

6 1-6 Identificadores de correlación Ejemplo: Antes de insertar un programa con una fecha de creación a partir del 2005, se muestra la facultad asociada. Ejemplo: CREATE OR REPLACE TRIGGER TR_PROG BEFORE INSERT ON PROGRAMA FOR EACH ROW WHEN (NEW.FECHA_CREACION >= TO_DATE('01/01/2005', 'dd/mm/yyyy')) DECLARE v_fac_nombre FACULTAD.NOMBRE%TYPE; BEGIN SELECT nombre INTO v_fac_nombre FROM FACULTAD where facultad_id = :NEW.FACULTAD_ID; DBMS_OUTPUT.PUT_LINE('Facultad asociada: ' || v_fac_nombre); END; CREATE OR REPLACE TRIGGER TR_PROG BEFORE INSERT ON PROGRAMA FOR EACH ROW WHEN (NEW.FECHA_CREACION >= TO_DATE('01/01/2005', 'dd/mm/yyyy')) DECLARE v_fac_nombre FACULTAD.NOMBRE%TYPE; BEGIN SELECT nombre INTO v_fac_nombre FROM FACULTAD where facultad_id = :NEW.FACULTAD_ID; DBMS_OUTPUT.PUT_LINE('Facultad asociada: ' || v_fac_nombre); END; SET SERVEROUTPUT ON; INSERT INTO PROGRAMA VALUES (1, 'Enfermería', TO_DATE('01/01/2013', 'dd/mm/yyyy'), 1) SET SERVEROUTPUT ON; INSERT INTO PROGRAMA VALUES (1, 'Enfermería', TO_DATE('01/01/2013', 'dd/mm/yyyy'), 1) Facultad asociada : Medicina

7 1-7 Identificadores de correlación Ejemplo: Antes de eliminar un programa con una fecha de creación a partir del 2005, se muestra la facultad asociada. Ejemplo: CREATE OR REPLACE TRIGGER TR_PROG_DELETE BEFORE DELETE ON PROGRAMA FOR EACH ROW WHEN (OLD.FECHA_CREACION >= TO_DATE('01/01/2005', 'dd/mm/yyyy')) DECLARE v_fac_nombre FACULTAD.NOMBRE%TYPE; BEGIN SELECT nombre INTO v_fac_nombre FROM FACULTAD where facultad_id = :OLD.FACULTAD_ID; DBMS_OUTPUT.PUT_LINE('Facultad asociada: ' || v_fac_nombre); END; CREATE OR REPLACE TRIGGER TR_PROG_DELETE BEFORE DELETE ON PROGRAMA FOR EACH ROW WHEN (OLD.FECHA_CREACION >= TO_DATE('01/01/2005', 'dd/mm/yyyy')) DECLARE v_fac_nombre FACULTAD.NOMBRE%TYPE; BEGIN SELECT nombre INTO v_fac_nombre FROM FACULTAD where facultad_id = :OLD.FACULTAD_ID; DBMS_OUTPUT.PUT_LINE('Facultad asociada: ' || v_fac_nombre); END; SET SERVEROUTPUT ON; DELETE FROM PROGRAMA WHERE PROGRAMA_ID = 1 SET SERVEROUTPUT ON; DELETE FROM PROGRAMA WHERE PROGRAMA_ID = 1 Facultad asociada : Medicina

8 1-8 Identificadores de correlación Triggers para guardar bitácoras Ej. Cada vez que se elimina un profesor se almacenan en otra tabla los datos del profesor eliminado, la fecha de eliminación y el usuario que lo eliminó. Triggers para guardar bitácoras Ej. Cada vez que se elimina un profesor se almacenan en otra tabla los datos del profesor eliminado, la fecha de eliminación y el usuario que lo eliminó. CREATE OR REPLACE TRIGGER TR_PRO_BITACORA BEFORE DELETE ON PROFESOR FOR EACH ROW BEGIN INSERT INTO PROFESOR_ELIMINADO VALUES (:OLD.CEDULA, :OLD.NOMBRE, :OLD.SALARIO, :OLD.FACULTAD_ID, SYSDATE, USER); END; CREATE OR REPLACE TRIGGER TR_PRO_BITACORA BEFORE DELETE ON PROFESOR FOR EACH ROW BEGIN INSERT INTO PROFESOR_ELIMINADO VALUES (:OLD.CEDULA, :OLD.NOMBRE, :OLD.SALARIO, :OLD.FACULTAD_ID, SYSDATE, USER); END;

9 1-9 Detectar tipo de operación DML Ejemplo (INSERTING, UPDATING, DELETING) CREATE OR REPLACE TRIGGER TR_PROG_OPTIONS BEFORE INSERT OR UPDATE OF NOMBRE, FECHA_CREACION OR DELETE ON PROGRAMA FOR EACH ROW BEGIN IF INSERTING THEN DBMS_OUTPUT.PUT_LINE('Programa creado: ' || :NEW.NOMBRE); END IF; IF UPDATING('NOMBRE') THEN DBMS_OUTPUT.PUT_LINE('Nombre programa anterior ' || :OLD.NOMBRE); DBMS_OUTPUT.PUT_LINE('Nombre programa nuevo ' || :NEW.NOMBRE); END IF; IF DELETING THEN DBMS_OUTPUT.PUT_LINE('Programa eliminado ' || :OLD.NOMBRE); END IF; END; CREATE OR REPLACE TRIGGER TR_PROG_OPTIONS BEFORE INSERT OR UPDATE OF NOMBRE, FECHA_CREACION OR DELETE ON PROGRAMA FOR EACH ROW BEGIN IF INSERTING THEN DBMS_OUTPUT.PUT_LINE('Programa creado: ' || :NEW.NOMBRE); END IF; IF UPDATING('NOMBRE') THEN DBMS_OUTPUT.PUT_LINE('Nombre programa anterior ' || :OLD.NOMBRE); DBMS_OUTPUT.PUT_LINE('Nombre programa nuevo ' || :NEW.NOMBRE); END IF; IF DELETING THEN DBMS_OUTPUT.PUT_LINE('Programa eliminado ' || :OLD.NOMBRE); END IF; END;

10 1-10 Orden de ejecución Cuando se definen varios triggers sobre una tabla cumplen el siguiente orden de ejecución: 1. Triggers Before (a nivel de sentencia) 2. Para cada fila: 1. Trigger Before ( a nivel de fila ) 2. Ejecuta la Sentencia 3. Triggers After (a nivel de fila) 3. Triggers After (a nivel de sentencia) Cuando se definen varios triggers sobre una tabla cumplen el siguiente orden de ejecución: 1. Triggers Before (a nivel de sentencia) 2. Para cada fila: 1. Trigger Before ( a nivel de fila ) 2. Ejecuta la Sentencia 3. Triggers After (a nivel de fila) 3. Triggers After (a nivel de sentencia)

11 1-11 Restricciones sobre triggers Tablas mutantes Es una tabla que está siendo modificada por un UPDATE, DELETE, o INSERT o una tabla que puede ser acualizada debido a los efectos de un DELETE CASCADE. Un trigger no puede modificar o consultar una tabla mutante. En resumen, dentro del cuerpo del trigger no se puede hacer una consulta o modificación sobre la tabla que está siendo afectada ese trigger. Al dispararse un trigger que incumple esta restricción se lanza una excepción. Esta restricción aplica para los triggers que usan la clausula FOR EACH ROW. Tablas mutantes Es una tabla que está siendo modificada por un UPDATE, DELETE, o INSERT o una tabla que puede ser acualizada debido a los efectos de un DELETE CASCADE. Un trigger no puede modificar o consultar una tabla mutante. En resumen, dentro del cuerpo del trigger no se puede hacer una consulta o modificación sobre la tabla que está siendo afectada ese trigger. Al dispararse un trigger que incumple esta restricción se lanza una excepción. Esta restricción aplica para los triggers que usan la clausula FOR EACH ROW.

12 1-12 Restricciones sobre triggers Ejemplo. Cada vez que se actualiza el salario, se inserta o elimina un profesor, se debe actualizar el campo TOTALSALARIOS de la tabla facultad con la suma de los salarios de todos los profesores. Ejemplo. CREATE OR REPLACE TRIGGER TR_ACT_SALARIOS AFTER UPDATE OF SALARIO OR DELETE OR INSERT ON PROFESOR FOR EACH ROW DECLARE v_total PROFESOR.SALARIO%TYPE; BEGIN SELECT SUM(SALARIO) INTO v_total FROM PROFESOR; UPDATE FACULTAD SET TOTALSALARIOS = v_total WHERE FACULTAD_ID = :OLD.FACULTAD_ID; END; CREATE OR REPLACE TRIGGER TR_ACT_SALARIOS AFTER UPDATE OF SALARIO OR DELETE OR INSERT ON PROFESOR FOR EACH ROW DECLARE v_total PROFESOR.SALARIO%TYPE; BEGIN SELECT SUM(SALARIO) INTO v_total FROM PROFESOR; UPDATE FACULTAD SET TOTALSALARIOS = v_total WHERE FACULTAD_ID = :OLD.FACULTAD_ID; END; UPDATE PROFESOR SET SALARIO = 5000 WHERE CEDULA = 1 Error SQL: ORA-04091: table BD2_ESTUDIANTES.PROFESOR is mutating, trigger/function may not see it

13 1-13 Restricciones sobre triggers Posibles estrategias Crear dos triggersCrear dos triggers Un trigger AFTER a nivel de fila (usando FOR EACH ROW). Este trigger permite guardar el id de la facultad que se va a actualizar en una variable global. (Definir la variable en un paquete) Un trigger AFTER a nivel de bloque (no usa el FOR EACH ROW así que no incumple la restricción). Calcular la suma de los salarios de los profesores y actualizar este valor en la tabla facultad para el id que está almacenado en la variable global. Para versiones de oracle a partir de 11g es posible usar un tipo especial de trigger llamado Compound (COmpuesto) que permite solucionar este tipo de problemas usando un solo trigger.Para versiones de oracle a partir de 11g es posible usar un tipo especial de trigger llamado Compound (COmpuesto) que permite solucionar este tipo de problemas usando un solo trigger. Posibles estrategias Crear dos triggersCrear dos triggers Un trigger AFTER a nivel de fila (usando FOR EACH ROW). Este trigger permite guardar el id de la facultad que se va a actualizar en una variable global. (Definir la variable en un paquete) Un trigger AFTER a nivel de bloque (no usa el FOR EACH ROW así que no incumple la restricción). Calcular la suma de los salarios de los profesores y actualizar este valor en la tabla facultad para el id que está almacenado en la variable global. Para versiones de oracle a partir de 11g es posible usar un tipo especial de trigger llamado Compound (COmpuesto) que permite solucionar este tipo de problemas usando un solo trigger.Para versiones de oracle a partir de 11g es posible usar un tipo especial de trigger llamado Compound (COmpuesto) que permite solucionar este tipo de problemas usando un solo trigger.

14 1-14 Ejercicio Resolver el ejercicio planteado para tablas mutantes usando las dos estrategias sugeridas.Resolver el ejercicio planteado para tablas mutantes usando las dos estrategias sugeridas.

15 1-15 Bibliografía Oracle® Database PL/SQL Language Reference -11g Release 1 (11.1) - 2009Oracle® Database PL/SQL Language Reference -11g Release 1 (11.1) - 2009


Descargar ppt "6 Triggers ORACLE - II Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega."

Presentaciones similares


Anuncios Google