La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

6 Triggers ORACLE - III 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 - III 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 - III 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 Triggers INSTEAD OF Una Vista no puede ser modificada por una instrucción DML si esa vista contiene funciones de grupo, claúsulas como GROUP BY, DISTINCT, joins o consultas jerárquicas.Una Vista no puede ser modificada por una instrucción DML si esa vista contiene funciones de grupo, claúsulas como GROUP BY, DISTINCT, joins o consultas jerárquicas. Por ejemplo, si una vista se crea a partir de dos tablas, un insert en esa vista en realidad puede significar que se inserte una fila en una tabla y se actualicen datos en la otra tabla.Por ejemplo, si una vista se crea a partir de dos tablas, un insert en esa vista en realidad puede significar que se inserte una fila en una tabla y se actualicen datos en la otra tabla. Un trigger INSTEAD OF definido sobre esa vista, al momento de dispararse hará las modificaciones directamente sobre las tablas implicadas en la vista.Un trigger INSTEAD OF definido sobre esa vista, al momento de dispararse hará las modificaciones directamente sobre las tablas implicadas en la vista. Una Vista no puede ser modificada por una instrucción DML si esa vista contiene funciones de grupo, claúsulas como GROUP BY, DISTINCT, joins o consultas jerárquicas.Una Vista no puede ser modificada por una instrucción DML si esa vista contiene funciones de grupo, claúsulas como GROUP BY, DISTINCT, joins o consultas jerárquicas. Por ejemplo, si una vista se crea a partir de dos tablas, un insert en esa vista en realidad puede significar que se inserte una fila en una tabla y se actualicen datos en la otra tabla.Por ejemplo, si una vista se crea a partir de dos tablas, un insert en esa vista en realidad puede significar que se inserte una fila en una tabla y se actualicen datos en la otra tabla. Un trigger INSTEAD OF definido sobre esa vista, al momento de dispararse hará las modificaciones directamente sobre las tablas implicadas en la vista.Un trigger INSTEAD OF definido sobre esa vista, al momento de dispararse hará las modificaciones directamente sobre las tablas implicadas en la vista.

3 1-3 Triggers INSTEAD OF Un trigger INSTEAD OF deberá ser siempre a nivel de fila (FOR EACH ROW) y las opciones BEFORE y AFTER no son válidasUn trigger INSTEAD OF deberá ser siempre a nivel de fila (FOR EACH ROW) y las opciones BEFORE y AFTER no son válidas No se puede definir una lista de columnas cuando se define que el trigger se dispara para el evento UPDATE. Se puede controlar la columna que se está actualizando en el cuerpo del trigger mediante la sentencia IF UPDATING (‘nombre columna’)No se puede definir una lista de columnas cuando se define que el trigger se dispara para el evento UPDATE. Se puede controlar la columna que se está actualizando en el cuerpo del trigger mediante la sentencia IF UPDATING (‘nombre columna’) EJ. BEFORE UPDATE OF nombre -- No está permitido Un trigger INSTEAD OF deberá ser siempre a nivel de fila (FOR EACH ROW) y las opciones BEFORE y AFTER no son válidasUn trigger INSTEAD OF deberá ser siempre a nivel de fila (FOR EACH ROW) y las opciones BEFORE y AFTER no son válidas No se puede definir una lista de columnas cuando se define que el trigger se dispara para el evento UPDATE. Se puede controlar la columna que se está actualizando en el cuerpo del trigger mediante la sentencia IF UPDATING (‘nombre columna’)No se puede definir una lista de columnas cuando se define que el trigger se dispara para el evento UPDATE. Se puede controlar la columna que se está actualizando en el cuerpo del trigger mediante la sentencia IF UPDATING (‘nombre columna’) EJ. BEFORE UPDATE OF nombre -- No está permitido

4 1-4 Ejemplo

5 1-5 Triggers INSTEAD OF Ejemplo: Creación de una vista para la información detallada de profesores CREATE OR REPLACE VIEW PROFESOR_DETALLES AS SELECT P.CEDULA, P.NOMBRE, P.SALARIO, P.FACULTAD_ID, F.NOMBRE FNOMBRE FROM PROFESOR P LEFT JOIN FACULTAD F ON P.FACULTAD_ID = F.FACULTAD_ID CREATE OR REPLACE VIEW PROFESOR_DETALLES AS SELECT P.CEDULA, P.NOMBRE, P.SALARIO, P.FACULTAD_ID, F.NOMBRE FNOMBRE FROM PROFESOR P LEFT JOIN FACULTAD F ON P.FACULTAD_ID = F.FACULTAD_ID INSERT INTO PROFESOR_DETALLES“ VALUES (10, 'Sofia', 3000, 2, ‘Derecho') Error SQL: ORA-01776: cannot modify more than one base table through a join view 01776. 00000 - "cannot modify more than one base table through a join view" Error SQL: ORA-01776: cannot modify more than one base table through a join view 01776. 00000 - "cannot modify more than one base table through a join view"

6 1-6 Triggers INSTEAD OF Ejemplo: Creación de una vista para la información detallada de profesores CREATE OR REPLACE TRIGGER TR_Profesor_Detalles INSTEAD OF INSERT OR UPDATE OR DELETE ON PROFESOR_DETALLES FOR EACH ROW BEGIN IF INSERTING THEN INSERT INTO PROFESOR VALUES (:NEW.CEDULA, :NEW.NOMBRE, :NEW.SALARIO, :NEW.FACULTAD_ID); UPDATE FACULTAD SET TOTALSALARIOS = TOTALSALARIOS + :NEW.SALARIO WHERE FACULTAD_ID = :NEW.FACULTAD_ID; ELSIF DELETING THEN DELETE FROM PROFESOR WHERE CEDULA = :OLD.CEDULA; UPDATE FACULTAD SET TOTALSALARIOS = TOTALSALARIOS - :OLD.SALARIO WHERE FACULTAD_ID = :OLD.FACULTAD_ID; ELSIF UPDATING ('SALARIO') THEN UPDATE PROFESOR SET SALARIO = :NEW.SALARIO WHERE CEDULA = :OLD.CEDULA; UPDATE FACULTAD SET TOTALSALARIOS = TOTALSALARIOS + (:NEW.SALARIO - :OLD.SALARIO) WHERE FACULTAD_ID = :OLD.FACULTAD_ID; END IF; END; CREATE OR REPLACE TRIGGER TR_Profesor_Detalles INSTEAD OF INSERT OR UPDATE OR DELETE ON PROFESOR_DETALLES FOR EACH ROW BEGIN IF INSERTING THEN INSERT INTO PROFESOR VALUES (:NEW.CEDULA, :NEW.NOMBRE, :NEW.SALARIO, :NEW.FACULTAD_ID); UPDATE FACULTAD SET TOTALSALARIOS = TOTALSALARIOS + :NEW.SALARIO WHERE FACULTAD_ID = :NEW.FACULTAD_ID; ELSIF DELETING THEN DELETE FROM PROFESOR WHERE CEDULA = :OLD.CEDULA; UPDATE FACULTAD SET TOTALSALARIOS = TOTALSALARIOS - :OLD.SALARIO WHERE FACULTAD_ID = :OLD.FACULTAD_ID; ELSIF UPDATING ('SALARIO') THEN UPDATE PROFESOR SET SALARIO = :NEW.SALARIO WHERE CEDULA = :OLD.CEDULA; UPDATE FACULTAD SET TOTALSALARIOS = TOTALSALARIOS + (:NEW.SALARIO - :OLD.SALARIO) WHERE FACULTAD_ID = :OLD.FACULTAD_ID; END IF; END;

7 1-7 Administrando Triggers Habilitar o dehabilitar un Trigger:Habilitar o dehabilitar un Trigger: ALTER TRIGGER nombre_trigger DISABLE | ENABLE Habilitar o dehabilitar todos los trigger de una tabla:Habilitar o dehabilitar todos los trigger de una tabla: ALTER TABLE nombre_tabla DISABLE | ENABLE ALL TRIGGERS Recompilar un Trigger:Recompilar un Trigger: ALTER TRIGGER nombre_trigger COMPILE Eliminar un Trigger:Eliminar un Trigger: DROP TRIGGER nombre_trigger Habilitar o dehabilitar un Trigger:Habilitar o dehabilitar un Trigger: ALTER TRIGGER nombre_trigger DISABLE | ENABLE Habilitar o dehabilitar todos los trigger de una tabla:Habilitar o dehabilitar todos los trigger de una tabla: ALTER TABLE nombre_tabla DISABLE | ENABLE ALL TRIGGERS Recompilar un Trigger:Recompilar un Trigger: ALTER TRIGGER nombre_trigger COMPILE Eliminar un Trigger:Eliminar un Trigger: DROP TRIGGER nombre_trigger

8 1-8 Ejercicios Crear un trigger que evite que se asocie un estudiante a un programa que pertenezca a una facultad sin profesores. Si no existen profesores para la facultad, se lanza la excepción (-20500, ‘Programa de una facultad sin profesores'). Recuerde que campo Programa_Id del estudiante puede ser nulo.Crear un trigger que evite que se asocie un estudiante a un programa que pertenezca a una facultad sin profesores. Si no existen profesores para la facultad, se lanza la excepción (-20500, ‘Programa de una facultad sin profesores'). Recuerde que campo Programa_Id del estudiante puede ser nulo. Cada vez que se intenta insertar un programa con una Facultad_id que no existe, se dispara un trigger que crea una facultad con el id proporcionado y nombre: ‘FacultadTemporal’.Cada vez que se intenta insertar un programa con una Facultad_id que no existe, se dispara un trigger que crea una facultad con el id proporcionado y nombre: ‘FacultadTemporal’. Crear un trigger que no permita insertar más de 50 estudiantes por programa.Crear un trigger que no permita insertar más de 50 estudiantes por programa. Crear un trigger que evite que se asocie un estudiante a un programa que pertenezca a una facultad sin profesores. Si no existen profesores para la facultad, se lanza la excepción (-20500, ‘Programa de una facultad sin profesores'). Recuerde que campo Programa_Id del estudiante puede ser nulo.Crear un trigger que evite que se asocie un estudiante a un programa que pertenezca a una facultad sin profesores. Si no existen profesores para la facultad, se lanza la excepción (-20500, ‘Programa de una facultad sin profesores'). Recuerde que campo Programa_Id del estudiante puede ser nulo. Cada vez que se intenta insertar un programa con una Facultad_id que no existe, se dispara un trigger que crea una facultad con el id proporcionado y nombre: ‘FacultadTemporal’.Cada vez que se intenta insertar un programa con una Facultad_id que no existe, se dispara un trigger que crea una facultad con el id proporcionado y nombre: ‘FacultadTemporal’. Crear un trigger que no permita insertar más de 50 estudiantes por programa.Crear un trigger que no permita insertar más de 50 estudiantes por programa.

9 1-9 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 - III 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