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.

Slides:



Advertisements
Presentaciones similares
SQL Sigla del nombre “Structured Query Language”.
Advertisements

VISTAS (VIEWS) DEFINICIÓN Y OBJETIVO DE LAS VISTAS.
Fernando Velasco
UNIVERSIDAD NACIONAL DE LOJA Carrera de Ingeniería en Sistemas
Maestría en Bioinformática Bases de Datos y Sistemas de Información Otros objetos de Base de Datos Ing. Alfonso Vicente, PMP
PL/SQL Francisco Moreno Universidad Nacional.
Diseño Físico Procedimientos Almacenados y Disparadores (Triggers)
PL/SQL Francisco Moreno Universidad Nacional.
SESIÓN 2. Completados por el tipo de objeto sobre el que actúan y el objeto concreto: CREATE DATABASE mibase ; Permite crear una base de datos llamada.
MySQL M.C. Pedro Bello López.
1 BD Activas: Motivación zLos SGBD convencionales son “pasivos”. Sólo ejecutan preguntas o transacciones realizadas por los usuarios o por los programas.
PL/SQL Francisco Moreno Universidad Nacional. Introducción al PL/SQL ¿Por qué PL/SQL? A pesar de que SQL tiene mecanismos de control condicional (cláusula.
Bases de Datos Relacionales
16/04/ Sesión 11 Funciones y procedimientos Ing. Ricardo Inquilla.
PL/SQL Francisco Moreno Universidad Nacional.
Subconsultas Avanzadas
Ing. Ricardo Carlos Inquilla Quispe
Procedimientos Almacenados Funciones Agregadas
Componentes sintácticos
UNITA - IBARRA TRIGGERS
Lenguaje Estructurado de Consultas
John Freddy Duitama M.U.de.A. Facultad de Ingeniería. Creación del esquema de Una Base de Datos. John Freddy Duitama Muñoz. Facultad de Ingeniería. U.de.A.
Laboratorio de Bases de datos
Universidad del Cauca – FIET – Departamento de Sistemas CAPITULO 11 Creando Vistas.
COMANDOS DML DML son las siglas de Data Manipulation Language y se refiere a los comandos que permiten a un usuario manipular los datos en un repositorio,
TRIGGERS EN ORACLE 8 J. Iriarte S. España
SQL (Structured Query Language / Lenguaje de consulta estructurado)‏
Universidad del Cauca – FIET – Departamento de Sistemas CAPITULO 19 Extensiones de Oracle 9i para las sentencias DML y DDL.
Triggers(Disparadores)
Características Objeto-Relacionales en Oracle Francisco Moreno Universidad Nacional.
LENGUAJE SQL.
Structured Query Language (Lenguaje Estructurado de Consultas)
John Freddy Duitama M.U.de.A. Facultad de Ingeniería. Creación del esquema de Una Base de Datos. John Freddy Duitama Muñoz. Facultad de Ingeniería. U.de.A.
SQL: DDL Francisco Moreno. SQL: DDL DDL: Lenguaje de Definición de Datos Permite crear objetos en la BD Tipos de objetos: - Tablas: corresponden a las.
SQL Sigla del nombre “Structured Query Language”.
COMANDOS DML DML son las siglas de Data Manipulation Language y se refiere a los comandos que permiten a un usuario manipular los datos en un repositorio,
Base de datos Francisco Castro. Creación de una tabla drop table TABLA cascade constraints; /*==============================================================*/
SQL (Structured Query Language) Lenguaje orientado a bases de datos y sobre todo, al manejo de consultas; el objetivo principal de SQL es la realización.
PUESTO-TRABAJO (Código-Puesto, Empresa, Sueldo, DNI- Contratado) TITULADO (DNI-Titulado, Nombre, Apellidos, Dirección) TITULACION (Iden-Titulación, Nombre,
Comandos de SQL Prog. Orientada a Eventos. Inserción de datos (INSERT) INSERT….VALUES INSERT INTO Tabla1 (Columna1, Columna2…) VALUES (‘ValorAlfa’, ValorNum…);
MSSQL SERVER CURSO BÁSICO 1. DESCRIPCIÓN DEL CURSO. Sesión 4: Sentencia Insert,Transacciones,Insert general, Insert Select * From, Sentencia Update,Update.
DISPARADORES Y SISTEMAS DE GESTION DE BASE DE DATOS DE SQL
Marzo de 2010Dos Ideas - La visión de Sistemas desde el Desarrollo SQL en PL/SQL Conceptos básicos.
(Lenguaje de consulta estructurado)
SQL es un estándar internacional para trabajar con bases de datos, que consta de dos partes: una parte para manipular datos y una parte para definir tipos.
ORACLE SQL - DML. Oracle SQL - DML  ¿Qué es DML?  Sus comandos  INSERT  UPDATE  DELETE.
Después de completar esta lección, debe ser capaz de:  Crear registro definidos por el usuario.  Crear un registro con el atributo %ROWTYPE.  Crear.
Lenguaje Estructurado de Consultas
5 Paquetes ORACLE Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega.
Base de Datos I – Ing. Mary Carlota Bernal J. BASE DE DATOS I PL/SQL.
Apuntes PL-SQL Triggers II. Tipos de datos compuestos Registros PL/SQL: Son similares a un tipo struct en C o a un tipo Registro en otros 3GL. Se componen.
SQL: DDL.
Apuntes PL-SQL Triggers I.
3 Cursores ORACLE Bases de datos II I-2014 Universidad del Cauca In. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca In. Wilson Ortega.
Administración de Base de Datos Integridad Prof Mercy Ospina Torres Prof Renny A. Hernandez
Mtr. Adrián Monge Monge Educación 2015 Maestría, Mención en Administración de Proyectos ULACITMaestría, Mención en Administración de Proyectos 2012 Licenciatura,
Bases de datos II Universidad del Cauca Ing. Wilson Ortega.
Base de Datos I – Ing. Mary Carlota Bernal J.  Cada instrucción PL/SQL tiene asociado internamente un cursor  Los cursores en PL/SQL pueden ser de dos.
Querys a bases de datos con MS ACCESS. DEFINAMOS LOS TERMINOS: DML=Lenguaje de manipulación de datos Las sentencias DML permiten generar consultas para.
DML Transact SQL Sesión X Triggers. Duración 2 Horas.
Diapositivas PLSQL ORACLE – Semana 2 Especialización en Desarrollo de soluciones Informáticas Universidad del Cauca Miguel Ángel Niño Zambrano.
6 Triggers ORACLE Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega Bases de datos II I-2014 Universidad del Cauca Ing. Wilson Ortega.
6 Copyright © 2004, Oracle. Todos los derechos reservados. Trabajar con Tipos de Dato Compuestos.
Lenguaje MySQL, DDL (Lenguaje de definición de datos) Ing. Linda Masias Morales.
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.
Crear una tabla (create table - sp_tables - sp_columns - drop table) Para ver las tablas existentes creadas por los usuarios en una base de datos usamos.
PL/SQL Francisco Moreno Universidad Nacional.
BASE DE DATOS IUPSM CLASE PRACTICA. PROF. ING. JOSE L GUZMAN H.
UN DISPARADOR O TRIGGER es un procedimiento que se ejecuta cuando se cumple una condición establecida al realizar una operación. Es una rutina autónoma.
BD Activas: Motivación
Transcripción de la presentación:

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

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

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)

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)

1-5 Ejemplos

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

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

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;

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;

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)

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.

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

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.

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.

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