Disparadores en ORACLE

Documentos relacionados
Disparadores en ORACLE

Bibliografía Oracle Database Concepts - 10g Release 2 (10.2) (Octubre 2005)

Disparadores en ORACLE

DISPARADORES EN SQL DISPARADORES EN SQL:1999 SINTAXIS GENERAL DE UN DISPARADOR EN SQL:1999 SINTAXIS GENERAL DE UN DISPARADOR EN SQL:1999

DISPARADORES EN SQL SINTAXIS GENERAL DE UN DISPARADOR EN SQL:2003

Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos. Triggers

Diseño de bases de datos

Triggers 27/11/2014. Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos. Triggers en Oracle

SUBPROGRAMAS PL/SQL César Martínez C. Profesor Instructor de Base de Datos Sede Puente Alto DUOC

PRÁCTICA III. DISPARADORES EN SQL (II)

SQL PROCEDURAL Triggers y Stored Procedures. Ing. Gustavo A. Correa Reina UNCPBA 2008

Concepto de vista. (con ciertas limitaciones). nivel físico) Una vista es una tabla virtual (no tiene una correspondencia a

Un ejemplo teórico de trigger podría ser éste:

Lenguaje SQL (2ª Parte) Definición de datos

Aplicaciones de las vistas Concepto de vista Vistas en SQL Vistas en SQL.

Tema 1. Bases de datos activas

Triggers en PL/SQL. Jonathan Medina Gómez Facultad de Ingeniería Universidad de Antioquia

Tema 1. Bases de datos activas

Uso de Disparadores. Miguel Angel Garduño Cordova Isaac Méndez Hernández

Disparadores en Oracle (Ejemplos Prácticos)

Los disparadores pueden ser utilizados para cumplir con alguna de las siguientes tareas:

//Sección de manejo de excepciones. Las rutinas de manejo de errores //aparecen aqui

Permite definir cada relación que pertenece a la base de datos relacional, incluyendo:

Otros objetos de Base de Datos

UNIVERSIDAD NACIONAL DE SAN AGUSTÍN FACULTAD DE PRODUCCIÓN Y SERVICIOS ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS LABORATORIO DE BASES DE DATOS 1

Maestría en Bioinformática. Bases de Datos y Sistemas de Información SQL: DML. Ing. Alfonso Vicente, PMP

Laboratorio Informix. Stored Procedures Triggers

EXAMEN: BASES DE DATOS 4º Ingeniería Informática (29 de enero de 2009)

Laboratorios de BASES DE DATOS. (I.T. Informática)

PL/SQL. - La unidad de programación utilizada por PL/SQL es el bloque. - Todos los programas de PL/SQL están conformados por bloques.

Pre-Taller Gestión de Privilegios de Usuarios 2. Manipulación de Vistas 3. Creación y manipulación de Triggers (Introducción al uso de PL/pgsql)

Oracle PL/SQL. Programa de Estudio.

Repaso. Laboratorio Informix. Stored Procedures. Ejemplo. Creación de stored procedures. Sql en un Procedimiento

Examen de Bases de datos Grado de Ingeniería en Informática, Febrero, 2015

E16 - Diseño de Sistemas de Bases de Datos Boletín 3

ÍNDICE PRIMERA PARTE... 17

1. Lenguaje de Definición de Datos. 2. Lenguaje de Manipulación de. Datos. M. C. Gustavo Alfonso Gutiérrez Carreón

Procedimientos almacenados en PL/SQL. Jonathan Medina Gómez Facultad de Ingeniería Universidad de Antioquia

Conceptos básicos de programación con PL/SQL

Integridad en sistemas de bases de datos relacionales

Conceptos de Bases de Datos Relacionales Triggers

ÍNDICE INTRODUCCIÓN...13

Bases de Datos SQL 1 SQL. Jorge Pérez R. Universidad de Talca, II Semestre 2006

Oracle Database: Programación con PL/SQL

Enlaces relacionados:

El Lenguaje SQL TEMA V. Grupo de Bas ses de Datos Avanzadas Univ. Carlo os III de Madrid. V.1 SQL como Lenguaje de Definición de Datos

Procedimientos, Funciones, Trigger y Cursores en ORACLE

Acceso a bases de datos MySQL con PHP

MANUALITO MS-SQL SERVER

FIREBIRD: SQL PROCEDIMENTAL (PSQL)

Haga clic para PostgreS cambiar el estilo

Tema 33. El lenguaje SQL

Introducción al SQL de InterBase: DDL y DML

Sistemas de Bases de Datos II ITS / ITSB EMT CETP

Conceptos básicos de programación con PL/SQL

Introducción a PL/SQL

RESTRICCIONES DE DOMINIOS

A.1. Definiciones de datos en SQL

LENGUAJE DE CONSULTA ESTRUCTURADO (SQL)

Los paquetes tienen dos partes: una especificación y un cuerpo que están almacenados por separado en la base de datos.

Checks, Triggers y Excepciones en InterBase: validando desde la base de datos

Administración Básica de Oracle 10g. Prácticas sobre trabajos.

ADMINISTRACIÓN DE BASE DE DATOS

GUÍA DE TRABAJO GRADO 11. Media Fortalecida - SENA Programación de Software Ing. Néstor Raúl Suarez Perpiñan Página 1 de 6

SQL (Structured Query Language)

Características del lenguaje SQL

Práctica 4: Estudio del SGBD Oracle 10 Gestión de Transacciones

Solución Ejercicio Prac. 3b (Esquema).

Access SQL: DDL y DML. Una empresa de Ingeniería precisa una base de datos para la gestión de sus proyectos.

Administración Básica de Oracle9i.

Examen de Bases de datos Grado de Ingeniería en Informática 3 de septiembre, 2015

GBD Diseño físico de DDBB

Tema 4. Manipulación de datos con SQL

ÍNDICE INTRODUCCIÓN...17

1. Introducción al PL/SQL 2. Conceptos Básicos de PL/SQL Estructura de Bloques Reglas y Convenciones del Lenguaje

Se crean para conservar la integridad referencial y la coherencia entre los datos entre distintas tablas.

VISUALIZACIÓN DE DATOS A PARTIR DE VARIAS TABLAS

GALA CONCEPTO COMMIT, ROOLBACK SAVEPOINTS (SAVE TRANSACTION) No Consultas. Definiciones Transacciones ( L33 )

Estándares para la construcción de Sentencias SQL

Gestión de nóminas diciembre 2011

PL/PGSQL. Extensión "procedural" de SQL

Interacción con el Servidor Oracle8. Copyright Oracle Corporation, All rights reserved.

3. El catálogo 26. Laboratorio de Bases de Datos

Sintaxis: CURSOR nombre_cursor[(param1 [IN] tipo1,... )] IS consulta ;

Si queremos modificar la contraseña de sys, una vez que accedamos al sistema como sys, escribiremos la sentencia:

Bases de Datos (Ingeniería Técnica en Informática de Sistemas)

GESTORES GESTORES DE BASES DE DATOS

Oracle Database: Introducción a SQL

Programando con PL/SQL en una Base de Datos Oracle

Formato para prácticas de laboratorio

departamento NUMBER(3) FK (DEPARTAMENTOS.CODIGO) salario NUMBER(3) NOT NULL fecha_alta DATE NOT NULL jefe NUMBER(5) FK (EMPLEADOS.

Modulo I: Introducción Gestores de Bases De Datos

SQL. (...la guía básica de supervivencia de dmi) Universidad de los Andes Demián Gutierrez Enero

Oracle básico (IV): Programación en PL/SQL

INSTITUTO TECNOLÓGICO SUPERIOR DE ESCÁRCEGA. Organismo público descentralizado de la administración. Pública del estado de Campeche

TRIGGER LEONEL CADOSO ROMERO 1

Integridad Referencial. Restricciones (constraints)

BASE DE DATOS QUÉ ES UNA BASE DE DATOS?

10 - Desencadenadores.

Grandes volúmenes de datos Particionamiento. bases de datos

Transcripción:

Disparadores en ORACLE Bibliografía Oracle Database Concepts 10g Release 2 (10.2) (Octubre 2005) Oracle Database Application Developer's Guide Fundamentals 10g Release 2 (10.2) (Noviembre 2005) Óscar Díaz Universidad del País Vasco (UPV) Bases de Datos Activas BD Triggers 1

Introducción : lenguaje de programación DECLARE optional estructurado en bloques BEGIN required Bloques: unidad mínima en END; required Soportan DML y DDL / Anónimos / Con nombre TRIGGERS Disparadores (triggers) i en Oracle: bloques de código que son implícitamente invocados cuando algo sucede CREATE TRIGGER NombreTrigger Triggers VS Procedimientos Ejecución Implícita: Disparar No admiten argumentos Aplicaciones: Restricciones (Constraints) - - - - - Auditorías END; / Informar de Eventos EXCEPTION optional BEFORE INSERT ON StarsIn DECLARE.. END; / TRIGGER CREATE PROCEDURE Get_emp_rec (Emp_number IN Emp_tab.Empno%TYPE) AS BEGIN PROCEDIMIENTO BD Triggers 2

Introducción 3 Tipos DML/DDL (Fila/Sentencia, BEFORE/AFTER) INSTEAD OF SYSTEM BD Triggers 3

Estructura General de un Disparador Evento CREATE [OR REPLACE] TRIGGER nombre {BEFORE AFTER INSTEAD OF} Temporalidad del Evento {INSERT DELETE UPDATE [OF <atributo>]} ON <tabla> [FOR EACH ROW STATEMENT] [WHEN condición] Granularidad Condición BEGIN END; cuerpo del trigger Acción BD Triggers 4

BEFORE Temporalidad del Evento: AFTER / BEFORE Ejecutan la acción asociada antes de que la sentencia sea ejecutada Decidir si la acción debe realizarse Utilizar valores alternativos ti para la sentencia AFTER CREATE TRIGGER NombreTrigger BEFORE Insert ON NombreTabla. Los de tipo BEFORE son mejores en términos de rendimiento i Ejecutan la acción asociada después de que se haya ejecutado la sentencia CREATE TRIGGER NombreTrigger AFTER Insert ON NombreTabla. BD Triggers 5

Granularidad del Evento: FOREACH ROW / STATEMENT A NIVEL DE FILA: ROW TRIGGERS Ejecutan la acción asociada tantas veces como filas se vean afectadas por la sentencia que lo dispara Si ninguna fila se ve afectada, no se dispara CREATE TRIGGER NombreTrigger BEFORE Insert ON NombreTabla FOR EACH ROW. Utilizar cuando la acción depende de la sentencia que produjo el evento o de las filas afectadas BD Triggers 6

Granularidad del Evento: FOREACH ROW / STATEMENT A NIVEL DE SENTENCIA: STATEMENT TRIGGERS Ejecutan una única vez la acción asociada, id independientemente del número de filas que se vean afectadas por la sentencia CREATE TRIGGER NombreTrigger BEFORE Insert ON NombreTabla [STATEMENT] Utilizar cuando la acción NO depende de la sentencia que produjo el evento o de las filas afectadas Comprobaciones de seguridad a cerca del usuario o el momento concreto Generar registros de auditoría BD Triggers 7

Condición Expresa una condición que debe cumplirse en el momento de producirse el evento, para que la acción sea ejecutada. WHEN persona.nombre = 'pepe' OR persona.edad > 35 Se puede utilizar cualquier combinación de operadores lógicos (AND, OR, NOT) y relacionales (< <= > >= = <>). No se puede especificar una condición para los disparadores a nivel de sentencia (STATEMENT) ni los disparadores INSTEAD OF Debe ser una consulta SQL y no puede contener subconsultas SELECT * FROM Productos WHERE PrecioUnidad IN (SELECT PrecioUnidad FROM DetallePedido WHERE Descuento = 0.25) BD Triggers 8

Orden de Ejecución Una sentencia SQL puede disparar varios TRIGGERS. La activación ación de un trigger puede ededisparardisparar la activación de otros triggers. 1. Ti Triggers Bf Before (nivel lde 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 (anivel desentencia) Se compromete o se deshace toda la transacción El orden de ejecución de disparadores del mismo tipo es indeterminado BD Triggers 9

Estructura General de un Disparador CREATE OR REPLACE TRIGGER Control_Docencia AFTER DELETE ON Profesores FOR EACH ROW WHEN old.nombre LIKE %Juan% Evento Condición DECLARE var VARCHAR2(50); BEGIN SELECT a.nombre INTO var FROM Asignaturas a WHERE REF(a) = :NEW.asignatura; Acción DELETE FROM Asignaturas WHERE nombre = var END; / BD Triggers 10

Correlation Identifiers: Valores OLD y NEW Tipo especial de variable tratada como un registro de tipo tabla_modificada%rowtype 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) 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 ió (UPDATE) Al valor NULL para una operación de borrado (DELETE) SINTAXIS Condición (WHEN.) OLD,, NEW En el cuerpo del disparador :OLD, :NEW BD Triggers 11

ROW TRIGGER: ejemplo Cuando se borre en la tabla persona alguna persona que se llame pepe o cuya edad sea mayor de 35 años, eliminar también dicha persona de la tabla persona2 Persona Cod Nombre Edad C1 C2 C3 C4 C5 María Pepe Pepe Luisa Pepe 25 40 45 48 22 Persona2 Cod Nombre Edad C1 C2 C3 C4 C5 María Pepe Pepe Luisa Pepe 25 40 45 48 22 DELETE FROM persona WHERE cod in ( C1, C3, C4 ) Borra C3 y C4 de persona2 BD Triggers 12

STATEMENT TRIGGER: ejemplo Cuando se borre en la tabla socio emitir un mensaje indicando que no se pueden borrar socios Socio Cod S1 S2 S3 S4 S5 Nombre Fecha_ant María Pepe Pepe Luisa Pepe............... DELETE FROM socio WHERE nombre = Pepe Borra 3 tuplas y se emite un único mensaje BD Triggers 13

Triggers DML Disparados por sentencias DML: INSERT, UPDATE o DELETE Todas las filas o sólo algunas (WHEN) LIBROS ESTADÍSTICAS ISBN GENERO TÍTULO GENERO TOTAL_LIBROSLIBROS 100-09-89 Novela El Quijote ----- ---- ---- Novela 50 Infantil 15 CREATE OR REPLACE TRIGGER UpdateEstadisticasGenero AFTER INSERT OR DELETE OR UPDATE ON Libros DECLARE BEGIN UDDATE Estadisticas ti SET. END UpdateEstadisticasGenero; / BD Triggers 14

Triggers INSTEAD OF Sólo sobre VISTAS EMPLEADO DEPARTAMENTO DNI NOMBRE DEPARTAMENT NOMBRE CÓDIGO O Contabilidad - 1 CT-1 11111111 José García CT-1 Recursos RRHH ----- ---- ---- Humanos CREATE VIEW EmpleadoDpto as SELECT e.nombre, d.nombre FROM Empleado E, Departamento D WHERE E.Departamento = D.Codigo; INSERT INTO EmpleadoDpato VALUES ( Carlos Gómez', Contabilidad-1 ); ERROR en línea 1: ORA-01779: no se puede modificar una columna que se corresponde con una tabla no reservada por clave CREATE OR REPLACE TRIGGER InsertEmepleadoDpto INSTEAD OF INSERT ON EmpleadoDpto DECLARE - - -- BEGIN INSERT INTO Empleado VALUES INSERT INTO Departamento VALUES END; BD Triggers 15

Triggers de Sistema Disparados por eventos del Sistema o eventos relacionados con las acciones de los Usuarios Sistema Arranque y parada: STARTUP, SHUTDOWN Transacciones: COMMIT, ROLLBACK Errores: SERVERERROR Usuarios Login / Logoff Sentencias DDL: CREATE, ALTER, DROP CREATE OR REPLACE TRIGGER LogCreations AFTER CREATE ON SCHEMA BEGIN INSERT INTO LogCreates (user_id, object_type, object _ name, object _ owner, creation_ date) VALUES (USER, ORA_DCIT_OBJ_TYPE, ORA_DICT_OBJ_NAME,ORA_DICT_OBJ_OWNER, SYSDATE) END LogCreations; / BD Triggers 16

BEFORE/AFTER Triggers: ejemplo CREATE OR REPLACE TRIGGER GenerarAutorID BEFORE INSERT OR UPDATE ON Autores FOR EACH ROW BEGIN SELECT id_autores INTO :new.id FROM Tabla_IDs; UPDATE Tabla_IDs SET id_autores = id_autores + 1; END GenerarAutorID; / INSERT INTO autores (nombre, apellidos) VALUES ('Lolita', 'Lazarus'); INSERT INTO autores (ID, nombre, apellidos) VALUES (-7, 'Zelda', 'Zoom'); BD Triggers 17

Funciones del Cuerpo del Disparador Inserting, Deleting, Updating CREATE OR REPLACE TRIGGER ejemplo BEFORE INSERT OR UPDATE OR DELETE ON tabla a BEGIN IF DELETING THEN Acciones asociadas al borrado ELSIF INSERTING THEN Acciones asociadas a la inserción modificación modificación END ejemplo; / ELSIF UPDATING[( COL1 )] Acciones asociadas a la ELSIF UPDATING[( COL2 )] Acciones asociadas a la END IF; BD Triggers 18

Elevar excepciones en el cuerpo del Disparador RAISE_APPLICATION_ ERROR (nro_error, mensaje); [-20000 y -20999] CREATE OR REPLACE TRIGGER ejemplo BEFORE DELETE ON tabla FOR EACH ROW BEGIN IF tabla.columna= valor_no_borrable THEN RAISE_APPLICATION_ERROR(-20000, La fila no se puede borrar ); END IF;... END ejemplo; BD Triggers 19

Declaración de Variables CREATE... BEFORE... [FOR EACH ROW...] DECLARE Declaración de variables BEGIN nombre CONSTANT NUMBER:=valor; nombre TIPO; nombre nombretabla.nombrecolumna%type; nombre nombretabla%rowtype BD Triggers 20

Activar / Desactivar disparadores Todos los disparadores asociados a una tabla: ALTER TABLE nombre_tabla ENABLE ALL TRIGGERS ALTER TABLE nombre_tabla DISABLE ALL TRIGGERS (Por defecto, todos están activados al crearse) Un disparador específico: ALTER TRIGGER nombre_disparador ENABLE ALTER TRIGGER nombre_disparador DISABLE BD Triggers 21

Consultar información sobre los disparadores Eliminar un disparador DROP TRIGGER nombre_disparador; Ver todos los disparadores y su estado SELECT TRIGGER_NAME, STATUS FROM USER_TRIGGERS; Ver el cuerpo de un disparador SELECT TRIGGER_BODY FROM USER_TRIGGERS WHERE TRIGGER_NAME='nombre_disparador'; Ver la descripción de un disparador SELECT DESCRIPTION FROM USER_TRIGGERS WHERE TRIGGER_NAME= 'nombre_disparador'; BD Triggers 22

Ejemplo CREATE TRIGGER Ejemplo AFTER DELETE ON tabla1 FOR EACH ROW WHEN ((OLD.nombre= pepe ) OR (OLD.edad > 35)) BEGIN DELETE FROM tabla2 WHERE tabla2.cod=:old.cod; END Ejemplo; / SELECT Trigger_body FROM USER_TRIGGERS WHERE Trigger_name = 'Ejemplo'; SELECT Trigger_type, Triggering_event, Table_name FROM USER_TRIGGERS WHERE Trigger_name = 'Ejemplo'; TRIGGER_BODY ---------------------------- BEGIN DELETE FROM tabla2 WHERE tabla2.cod=:old.cod; END Ejemplo; / TYPE TRIGGERING_STATEMENT TABLE_NAME ---------------- -------------------- ---------- AFTER EACH ROW DELETE tabla1 BD Triggers 23

Restricciones: tablas mutantes Tabla mutante (mutating) tabla que está siendo modificada por una operación DML tabla que se verá afectada por los efectos de un DELETE CASCADE debido a la integridad referencial (hasta Oracle8i). Las órdenes del cuerpo de un disparador (de tipo FOR EACH ROW) no pueden Leer o actualizar una tabla mutante que esté en la propia declaración del disparador MUTATING TABLE ERROR RUNTIME ERROR BD Triggers 24

Tablas Mutantes: ejemplo CREATE OR REPLACE TRIGGER trigger_asignaturas BEFORE INSERT OR UPDATE ON asignaturas FOR EACH ROW DECLARE v_total NUMBER; v_nombre VARCHAR2(30); BEGIN SELECT COUNT(*)INTO v_total FROM asignaturas -- ASIGNATURAS está MUTANDO WHERE DNI = :NEW.DNI; -- comprueba si el profesor está sobrecargado IF v_total >= 10 THEN SELECT nombre ' ' apellidos INTO v_nombre FROM profesores WHERE DNI = :NEW.DNI; RAISE_APPLICATION_ERROR (-20000, El profesor ' v_nombre ', está sobrecargado'); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR APPLICATION ERROR (-20001 20001, Datos de profesor incorrectos'); END; BD Triggers 25

Tablas Mutantes: ejemplo UPDATE asignaturas SET DNI = 000000000 WHERE asignaturas_id id = BD ; UPDATE section * ERROR at line 1: SELECT COUNT(*) INTO v_total FROM asignaturas WHERE DNI = :NEW.DNI; ORA-04091: table BD_XX.ASIGNATURAS is mutating, trigger/function may not see it ORA-06512: at "BD_XX.TRIGGER_ASIGNATURAS", G S" line 5 ORA-04088: error during execution of trigger 'BD_XX.TRIGGER_ASIGNATURAS' BD Triggers 26

Tablas Mutantes: solución Crear 2 disparadores En el disparador a nivel de fila (for each row) almacenamos los datosque queremos consultar (los que provocan el error de tabla mutante) En el disparador d a nivel lde orden (statement) t t t) realizamos la consulta (usando los datos almacenados) La mejor forma de almacenar los valores es utilizar un paquete (opcionalmente, podríamos utilizar una tabla) BD Triggers 27

Tablas Mutantes: solución En el trigger a nivel de fila guardaremos el DNI y el nombre del profesor Necesitamos 2 variables globales para que esos datos estén disponibles más adelante, al ejecutar el trigger a nivel de fila Por lo tanto, creamos un paquete que contendrá esas dos variables dos variables CREATE OR REPLACE PACKAGE pck_profesores AS END; v_dni_profesor profesor.dni%type; v_nombre_profesor varchar2(50); BD Triggers 28

Tablas Mutantes: solución En el cuerpo del trigger a nivel de fila usamos las variables del paquete para guardar el DNI y el nombre del profesor CREATE OR REPLACE TRIGGER trigger_asignaturas BEFORE INSERT OR UPDATE ON asignaturas FOR EACH ROW BEGIN IF :NEW.DNI IS NOT NULL THEN BEGIN pck_profesores.v_dni_profesor := :NEW.DNI; END; END IF; END; SELECT nombre ' ' apellidos INTO pck_profesores.v_nombre_profesor FROM profesores WHERE DNI = pck_profesores.dni; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20001, Datos de Profesor erroneos'); BD Triggers 29

Tablas Mutantes: solución TRIGGER a nivel de sentencia Ahora realizamos la consulta utilizando las variables globales CREATE OR REPLACE TRIGGER trigger _ asignaturas _ statement AFTER INSERT OR UPDATE ON asignaturas DECLARE BEGIN v_total INTEGER; SELECT COUNT(*) INTO v_total FROM asignaturas WHERE DNI = pck_profesores.v_dni_profesor; -- comprobamos si el profesor aludido está sobrecargado IF v_total t >= 10 THEN END; END IF; RAISE_APPLICATION_ERROR (-20000, 'El profesor, ' pck_profesores.v_nombre_profesor ', está sobrecargado'); BD Triggers 30

Tablas Mutantes: solución UPDATE asignaturas SET DNI = 000000000 WHERE asignaturas_id id = BD ; UPDATE asignaturas * ERROR at line 1: ORA-20000: El profesor Carlos Romero está sobrecargado ORA-06512: at "BD_XX.TRIGGER_ASIGNATURAS_STATEMENT", line 11 ORA-04088: error during execution of trigger 'BD_ XX.TRIGGER_ ASIGNATURAS_ STATEMENT' BD Triggers 31

TRANSACCIONES y TRIGGERS Los cambios hechos en un TRIGGER deben ser comprometidos o deshechos con la transacción en la que se ejecutan SQL> CREATE TABLE tab1 (col1 NUMBER); Tabla creada. SQL> CREATE TABLE log (timestampt DATE, operacion VARCHAR2(2000)); Tabla creada. SQL> CREATE TRIGGER tab1_trig 2 AFTER insert ON tab1 3 BEGIN 4 INSERT INTO log VALUES (SYSDATE, 'Insert en TAB1'); 5 COMMIT; 6 END; 7 / Trigger created. SQL> INSERT INTO tab1 VALUES (1); INSERT INTO tab1 VALUES (1) * ERROR at line 1: ORA-04092: cannot COMMIT in a trigger ORA-06512: at BD_XX.TAB1_TRIG", line 3 ORA-04088: error during execution of trigger BD_XX.TAB1_TRIG' BD Triggers 32

TRANSACCIONES y TRIGGERS Se pueden utilizar autonomous transactions de manera que el TRIGGER se ejecute en su propia transacción SQL> CREATE OR REPLACE TRIGGER tab1_trig 2 AFTER insert ON tab1 3 DECLARE 4 PRAGMA AUTONOMOUS_TRANSACTION; 5 BEGIN 6 INSERT INTO log VALUES (SYSDATE, 'Insert on TAB1'); 7 COMMIT; 8 END; 9 / Trigger created. SQL> INSERT INTO tab1 VALUES (1); 1 row created. BD Triggers 33

TRANSACCIONES AUTÓNOMAS Se pueden utilizar autonomous transactions de manera que el TRIGGER se ejecute en su propia transacción CREATE OR REPLACE PROCEDURE Grabar_Log(descripcion VARCHAR2) IS PRAGMA AUTONOMOUS_TRANSACTION; BEGIN INSERT INTO LOG_APLICACION (CO_ERROR, DESCRIPICION, FX_ERROR) VALUES (SQ_ERROR.NEXTVAL, descripcion, SYSDATE); COMMIT; -- Este commit solo afecta a la transaccion autonoma END ; -- utilizamos el procedimiento desde un bloque DECLARE producto PRECIOS%TYPE; BEGIN producto := '100599'; INSERT INTO PRECIOS (CO_PRODUCTO, PRECIO, FX_ALTA) VALUES (producto, 150, SYSDATE); COMMIT; EXCEPTION WHEN OTHERS THEN Grabar_Log(SQLERRM); ROLLBACK; del END; -- Los datos grabados por "Grabar_Log" se escriben en la base de datos a pesar -- ROLLBACK, ya que el procedimiento está marcado como transacción autonoma. BD Triggers 34

Ejemplos Dada la siguiente relación: SOCIO (num_soc, nombre, direccion, telefono) Se desea mantener la información de los socios aunque estos se den de baja, para lo que se crea una tabla SOCIO_BAJA, que contiene los datos de socio y la fecha de baja y que se actualizará cada vez que se borre un socio SOCIO_BAJA (num_soc, nombre, direccion, telefono, fecha_baja) BD Triggers 35

Ejemplos CREATE OR REPLACE TRIGGER borrar_socio AFTER DELETE ON socio FOR EACH ROW / BEGIN INSERT INTO socio_baja VALUES (:OLD.num_soc, :OLD.nombre, :OLD.direccion, :OLD.telefono, SYSDATE); END borrar_socio; BD Triggers 36

Ejemplos Dadas las siguientes relaciones: PRODUCTO (cod_prod, descripción, proveedor, unid_vendidas) ALMACEN (cod_prod_s, _ stock, stock_min, stock_max) 1. Se desea mantener actualizado el stock del ALMACEN cada vez que se vendan unidades de un determinado producto p 2. Cuando el stock esté por debajo del mínimo lanzar un mensaje de petición de compra. Se indicará el número de unidades a comprar, según el stock actual y el stock maximo 3. Si el stock es menor que el mínimo stock permitido, impedir la venta BD Triggers 37

Ejemplos Dadaslassiguientes relaciones: PROFESOR (cod_prof) CLASE (cod_clase, cod_prof) Se define la siguiente vista: CREATE VIEW informe_profesores AS SELECT p.cod_prof, COUNT(c.cod_clase) total_clases FROM profesor p, clase c WHERE p.cod_prof = c.cod_prof (+) GROUP BY p.cod_prof; Se desea poderinvocar sentencias del tipo: DELETE FROM informe_profesores WHERE cod_prof = 109; BD Triggers 41

Disparadores en ORACLE Bibliografía Oracle Database Concepts 10g Release 2 (10.2) (Octubre 2005) Oracle Database Application Developer's Guide Fundamentals 10g Release 2 (10.2) (Noviembre 2005) Óscar Díaz Universidad del País Vasco (UPV) Bases de Datos Activas BD Triggers 43