Apuntes PL-SQL Triggers I.

Slides:



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

VISTAS (VIEWS) DEFINICIÓN Y OBJETIVO DE LAS VISTAS.
Rocío Contreras Águila Primer Semestre 2010
Base de Datos Orientada a Objetos (OODBMS)
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.
4.3. Privilegios de usuarios
PL/SQL Francisco Moreno Universidad Nacional.
MySQL M.C. Pedro Bello López.
Lenguaje SQL (Structured Query Language)
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
Procedimientos Almacenados Funciones Agregadas
Bases de datos en la Web n Las bases de datos permiten almacenar de una forma estructurada y eficiente toda la información de un sitio web n Ventajas –Proporcionar.
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.
Universidad del Cauca – FIET – Departamento de Sistemas CAPITULO 11 Creando Vistas.
COMANDOS SQL.
PL/SQL Francisco Moreno Universidad Nacional.
CAPITULO 10 Manejando Restricciones
TRIGGERS EN ORACLE 8 J. Iriarte S. España
SQL: DDL Francisco Moreno & Carlos Mario Zapata. SQL:DDL DDL: Lenguaje de Definición de Datos Permite crear objetos en la Base de Datos Tipos de Objetos:
SQL (Structured Query Language / Lenguaje de consulta estructurado)‏
Mayo de 2009Dos Ideas - La visión de Sistemas desde el Desarrollo Manipulación de Datos Conceptos básicos.
Triggers(Disparadores)
Características Objeto-Relacionales en Oracle Francisco Moreno Universidad Nacional.
Data Manipulation Language (DML) Lenguaje de Manipulación de Datos
LENGUAJE SQL.
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”.
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,
MSSQL SERVER CURSO BÁSICO 1. DESCRIPCIÓN DEL CURSO. Sesión 4: Sentencia Insert,Transacciones,Insert general, Insert Select * From, Sentencia Update,Update.
Comandos DDL Los comandos DDL son las siglas de Data Definition Language, y se corresponde con el conjunto de órdenes que permiten definir las estructuras.
DISPARADORES Y SISTEMAS DE GESTION DE BASE DE DATOS DE SQL
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.
MULTIPLAN Multiplan es la práctica en grupo que hemos tenido que realizar durante el curso según las especificaciones dadas en la asignatura.
Usuarios. Colocar el servidor en el modo de autenticación Windows/SqlServer. En SQL Server Management Studio, click derecho, Propiedades en la Instancia.
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.
Base de Datos SQL - Introductorio - DDL. DEFINICIÓN SQL Volver a los Objetivos.
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.
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.
DLM Transact SQL Sesión II Recuperación de información.
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.
Copyright  Oracle Corporation, All rights reserved. 11 Creación de Vistas.
DML Transact SQL Sesión X Triggers. Duración 2 Horas.
Una base de datos, a fin de ordenar la información de manera lógica, posee un orden que debe ser cumplido para acceder a la información de manera coherente.
Php y mysql índice 1. Conexión 6. Ejercicio 5. Insertar un registro 2. Operaciones básicas 3. Seleccionar BD 4. Crear una BD P h p y m y s q l Índice 1.
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.
Copyright  Oracle Corporation, All rights reserved. 10 Constraints (Restricciones)
PL/SQL Francisco Moreno Universidad Nacional.
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.
Transcripción de la presentación:

Apuntes PL-SQL Triggers I

Triggers ¿Qué son? Bloques de código PL-SQL que se ejecutan automáticamente cuando se produce un evento. Tipos de triggers. Aplicación: Asociados a un evento del interfaz de usuario (clic de un botón, pérdida de foco…). Se usan en Oracle Developer. Datos: Asociados a una modificación de los datos que hay en las tablas: INSERT, UPDATE o DELETE. Sistema: Asociados a un evento del sistema. (Login, Error del Servidor, Arranque de la BD, etc…).

Creación de triggers de datos Momento: BEFORE o AFTER o INSTEAD OF. Evento: INSERT ó UPDATE ó DELETE Nombre Tabla: On NombreTabla Tipo de Disparo: Por fila o por sentencia. Condición de disparo: Claúsula WHEN. (sólo en triggers por fila). Cuerpo del trigger: DECLARE BEGIN END;

Elementos de un trigger Momento: ¿Cuándo se va a disparar? BEFORE: Antes de la instrucción DML, indicado si el trigger sirve para comprobar si la operación DML debe hacerse o no. AFTER: Si queremos que la sentencia se ejecute antes que el trigger y además no se prevee que el trigger vaya a hacer fallar la sentencia. INSTEAD OF: Solo para modificar vistas que no son actualizables directamente.

Elementos de un trigger Evento: ¿Por qué se ejecuta el trigger? INSERT UPDATE ( de cualquier columna o de algunas en concreto). DELETE Combinación de las anteriores.

Elementos de un trigger Tipo de Disparo: ¿Cuántas veces se va a disparar cuando se produce el evento? Por sentencia: Se ejecuta una sola vez, incluso aunque no haya filas afectadas. Se usan si la acción del trigger no depende de los valores de los datos afectados por la operación. Por fila: Se ejecuta tantas veces como filas se vean afectadas por la operación. Se usan si la acción del trigger depende de los datos afectados.

Elementos del trigger Cuerpo del trigger: ¿Qué acción va a realizar el trigger? El cuerpo del trigger es un bloque PL/SQL: DECLARE BEGIN EXCEPTION END; Puede contener variables, cursores, excepciones… Si el trigger es de fila se permite acceder al valor de los datos afectados por la orden DML empleando :old y :new.

Orden de disparo Supongamos cuatro triggers definidos sobre la tabla emp llamados: BeforeStatement BeforeRow AfterRow AfterStatement y una instrucción DML que afecta a tres registros, por ejemplo: UPDATE emp SET sal = sal *2 WHERE deptno=30;

Orden de disparo BeforeStatement AfterStatement BeforeRow AfterRow 7839 KING 1200 30 7698 BLAKE 2100 7788 SMITH 2300

Uso de predicados condicionales Cuando un trigger puede ser disparado por varias operaciones distintas, hay una forma de saber dentro del código del trigger cual de ellas lo disparó, se llaman predicados condicionales y se usan así: IF INSERTING THEN… IF UPDATING [(‘nombreColumna’)] THEN… IF DELETING THEN…

Ejemplos de Triggers Supongamos que queremos hacer un trigger que impida insertar datos en la tabla emp fuera del horario normal de oficina. Veamos que tipo de trigger es: Momento: BEFORE, ya que es un trigger cuyo objetivo es comprobar si la operación debe hacerse o no. Tipo de Disparo: Por sentencia, ya que el contenido de los datos no es relevante.

Ejemplos de triggers El código del trigger anterior sería: CREATE OR REPLACE TRIGGER SeguridadEmp BEFORE INSERT ON emp BEGIN IF (TO_CHAR(sysdate, ‘DY’) IN (‘SAT’, ‘SUN’) OR TO_CHAR(sysdate,’HH24) NOT BETWEEN ’08’ AND ’15’ THEN RAISE_APPLICATION_ERROR( -20100, ‘No puedes insertar registros fuera del horario normal de oficina’); END IF; END; / Nota: Cuando un trigger termina con excepciones no tratadas, la sentencia que lo disparó hace un ROLLBACK automáticamente.

Uso de :old y :new Solo para triggers por fila. Sirven para referirse al valor anterior y posterior a una modificación. INSERT: solo existe :new DELETE: solo existe :old UPDATE: existen :old y :new Para usarlos en una claúsula WHEN se le quitan los dos puntos.

Restricciones en el uso de triggers No pueden ejecutarse instrucciones DDL. No pueden ejecutarse instrucciones de control de transacciones (COMMIT, ROLLBACK, …) Por sentencia: No tiene sentido el uso de :old y :new. Por fila: No puedo consultar los datos de la tabla que ha disparado el trigger, esto es, no puedo hace una SELECT de esa tabla (problema de tablas mutantes).

Ejemplos de triggers Supongamos que queremos hacer un trigger que no permita a un empleado ganar más de 5000 si no es el presidente (restricción de integridad de datos compleja). Veamos que tipo de trigger es: Momento: BEFORE, ya que es un trigger cuyo objetivo es comprobar si la operación debe permitirse o no. Tipo de Disparo: Por fila, ya que el contenido de los datos es necesario. Evento: Se disparará cuando haya un INSERT o un UPDATE del sueldo o un UPDATE del oficio.

Ejemplos de triggers El código del trigger anterior sería: CREATE OR REPLACE TRIGGER ControlSueldo BEFORE INSERT OR UPDATE ON EMP FOR EACH ROW BEGIN IF :new.sal>5000 AND :new.job!='PRESIDENT' THEN RAISE_APPLICATION_ERROR(-20100, 'No puede ganar tanto si no es presidente'); END IF; END; /

Triggers INSTEAD OF Se utilizan para modificar datos en vistas que no son actualizables directamente porque les falta algún campo requerido en las tablas en que se basa la vista. Se ejecutan en lugar de la sentencia que provoca su disparo. Ver ejemplo de la página 254 del libro del martillo.

Gestión de triggers Cuando se crea un trigger, se activa automáticamente. Puede ser interesante desactivarlo para que no interfiera en la fase de pruebas de otros triggers. Para desactivar un trigger: ALTER TRIGGER NombreTrigger DISABLE; Para activar un trigger: ALTER TRIGGER NombreTrigger ENABLE; Para activar o desactivar todos los triggers asociados a una tabla: ALTER TABLE NombreTabla ENABLE o DISABLE ALL TRIGGERS; Para borrar un trigger definitivamente: DROP TRIGGER NombreTrigger;

Triggers de sistema Pueden funcionar para un esquema (o usuario) concreto o para toda la base de datos (todos los usuarios). Los eventos que se pueden considerar son: CREATE, ALTER o DROP Conexión y desconexión Arranque y parada de la base de datos. Cuando se produzca un error concreto o un error cualquiera.

Sintáxis de triggers de sistema Evento DDL (creación, modificación o borrado de un objeto): CREATE OR REPLACE TRIGGER NombreTrigger [BEFORE | AFTER] [CREATE|ALTER|DROP] OR [CREATE|ALTER|DROP] … ON [DATABASE | SCHEMA] DECLARE BEGIN EXCEPTION END;

Sintáxis de triggers de sistema Eventos del sistema: CREATE OR REPLACE TRIGGER NombreTrigger [eventosys] OR [eventosys] … ON [DATABASE | SCHEMA] DECLARE BEGIN EXCEPTION END; eventosys puede ser uno de los siguientes: AFTER SERVERERROR AFTER LOGON BEFORE LOGOFF AFTER STARTUP BEFORE SHUTDOWN

Ejemplo de trigger de sistema Supongamos que queremos guardar en una tabla las conexiones y desconexiones de la base de datos de un usuario concreto para saber cuanto tiempo ha estado conectado a la base de datos. CREATE OR REPLACE TRIGGER ControlEntrada AFTER LOGON ON SCHEMA BEGIN INSERT INTO UsoBD (cod_user, hora, accion) VALUES (USER, SYSDATE, ‘Entrada’); END; CREATE OR REPLACE TRIGGER ControlSalida BEFORE LOGOFF ON SCHEMA VALUES (USER, SYSDATE, ‘Salida’);

Usos más frecuentes de los triggers Seguridad. Auditorías. Integridad de datos. Integridad referencial. Replicación de tablas. Cálculo de datos derivados. Control de Eventos.

Triggers de seguridad Los permisos de usuario permiten modificar o no las tablas a un usuario concreto, pero con triggers podemos hacer que ciertos valores de los datos solo puedan ser introducidos por ciertos usuarios. Otro ejemplo de trigger de seguridad es el que solo permite trabajar a unas horas determinadas.

Triggers de auditoría Son aquellos triggers que permiten guardar información sobre los usuarios que realizan determinadas operaciones en la base de datos, incluyendo los valores introducidos en dicha operación, cuando las realizan, etc... Hemos visto varios ejemplos de triggers de auditoría.

Triggers de integridad de datos Como hemos visto, en ocasiones hay restricciones en los valores de los datos que no se pueden implementar con un simple CHECK en la creación de la tabla. Algunos ejemplos que hemos visto ya: Sólo el presidente puede ganar más de 5000. Sólo los vendedores pueden tener comisiones.

Triggers de integridad referencial Ya sabemos que ORACLE mantiene la integridad referencial definiendo FOREIGN KEYs y la opción ON DELETE CASCADE. Así, por ejemplo, no podemos introducir en el campo deptno de la tabla emp un valor que no exista en la tabla dept o borrar un departamento sin borrar los empleados asociados, pero no existe la posibilidad de actualizar en cascada si no se emplea un trigger para ello.

Triggers de integridad referencial Veamos un trigger de actualización en cascada: CREATE OR REPLACE TRIGGER OnUpdateCascade AFTER UPDATE OF deptno ON dept FOR EACH ROW BEGIN UPDATE emp SET emp.deptno = :new.deptno WHERE emp.deptno = :old.deptno END; /

Triggers de replicación de tablas Los triggers de replicación se usan para mantener copias remotas en tiempo real de ciertas tablas. Simplemente consisten en realizar en las réplicas las mismas operaciones DML que se van haciendo en las tablas maestras. Las réplicas se pueden hacer en la misma base de datos o en otra base de datos si usamos un enlace de base de datos.

Triggers de cálculo de datos derivados En ocasiones, para evitar que se realice repetidamente un mismo cálculo a partir de los datos, es conveniente introducir un cierto grado de redundancia en la base de datos. Un ejemplo de esto sería la creación de una columna total_salarios en la tabla dept donde se guarde la suma de los salarios de todos los empleados de cada departamento. El problema de introducir redundancia es la posible inconsistencia de los datos, para asegurar esta consistencia se emplean triggers de cálculo de datos derivados.

Triggers de cálculo de datos derivados Vamos a ver como se haría el trigger para mantener la consistencia, usando por primera vez una llamada a un procedimiento desde un trigger: CREATE OR REPLACE TRIGGER MantenerTotalSalarios AFTER INSERT OR UPDATE OF SAL OR DELETE ON emp FOR EACH ROW BEGIN IF DELETING THEN actualizartotal (:old.deptno, -1 * :old.sal); ELSIF UPDATING THEN actualizartotal(:new.deptno, :new.sal-:old.sal); ELSE – insercion actualizartotal(:new.deptno, :new.sal); END IF; END; /

Triggers de cálculo de datos derivados Finalmente, vamos a ver el código del procedimiento actualizartotal: CREATE OR REPLACE actualizartotal (v_deptno IN dept.deptno%TYPE, v_sal IN dept.totalsalarios%TYPE) IS BEGIN UPDATE dept SET totalsalarios = NVL(totalsalarios, 0) + v_sal WHERE deptno = v_deptno; END; /

Triggers de control de eventos Un ejemplo típico de trigger de control de eventos es el que se diseña en una base de datos de almacén para que se generen pedidos automáticamente para aquellos productos cuyo stock esté por debajo de un umbral de existencias predeterminado. En este caso, el evento es la bajada de las existencias por debajo del umbral aceptable. Este problema será resuelto en una de las prácticas que vais a llevar a cabo.