Disparadores en ORACLE



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

Disparadores en ORACLE. Disparadores Tema 11

Disparadores en ORACLE

Diseño de bases de datos

PRÁCTICA III. DISPARADORES EN SQL (II)

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

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

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

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

Disparadores en Oracle (Ejemplos Prácticos)

Tema 1. Bases de datos activas

Tema 1. Bases de datos activas

Otros objetos de Base de Datos

Triggers 24/12/2016. Escuela Técnica Superior de Ingeniería Informática Departamento de Lenguajes y Sistemas Informáticos. Triggers en Oracle

Procedimientos, Funciones, Trigger y Cursores en ORACLE

Diseño de bases de datos

Triggers. BASES DE DATOS Mercedes García Merayo

Formato para prácticas de laboratorio

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

Disparadores en ORACLE

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

MANUALITO MS-SQL SERVER

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

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

PL/SQL. Con PL/SQL vamos a poder programar las unidades de programa de la base de datos Oracle:

Laboratorio Informix. Stored Procedures Triggers

Integridad en sistemas de bases de datos relacionales

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

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

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

Oracle 12c DISEÑO Y PROGRAMACIÓN

A.1. Definiciones de datos en SQL

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

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

SQL (Structured Query Language)

Restricciones de Integridad

Programación SQL. Lucio Salgado Diciembre 2008

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

Unidad III: Lenguaje de manipulación de datos (DML) 3.1 Inserción, eliminación y modificación de registros

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

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

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

Formato para prácticas de laboratorio

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

Tema: Disparadores Parte I.

ADMINISTRACIÓN DE BASE DE DATOS

Enlaces relacionados:

El lenguaje de manipulación de datos (DML) es una parte fundamental de SQL.

Acceso a bases de datos MySQL con PHP

A. Introducción. B. Los DATABASES TRIGGERS. PL/SQL en objetos de la base de datos. Oracle 11g - SQL, PL/SQL, SQL*Plus 271

BASE DE DATOS QUÉ ES UNA BASE DE DATOS?

Iniciando con Oracle. Índice de contenido. Ingresando a Oracle. Cambiando Su Contraseña. Ingresando un Comando SQL en SQL*Plus

TEMA 6: MODIFICACIÓN DE LA BASE DE DATOS EN SQL

PL/SQL avanzado: Secuencias, triggers, cursores y subprogramas

Administración Básica de Oracle9i.

Estándares para la construcción de Sentencias SQL

1

- Bases de Datos - - Diseño Físico - Luis D. García

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

Haga clic para PostgreS cambiar el estilo

UNIVERSIDAD DEL ISTMO CAMPUS IXTEPEC LIC. INFORMATICA GRUPO 508 PROCEDIMIENTOS ALMACENADOS EN SQL SERVER 2000

Consultas con combinaciones

FIREBIRD: SQL PROCEDIMENTAL (PSQL)

Creación y Gestión de Tablas. Copyright Oracle Corporation, All rights reserved.

Sub consultas avanzadas

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

Tema 4. Manipulación de datos con SQL

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

Bases de datos relacionales y el modelo entidad-relación

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

El usuario puede utilizar esta tabla derivada como una tabla más, en sus consultas.

BASE DE DATOS - CURSO 02/03 PRÁCTICA 2: SQL: Lenguaje de definición de datos (DDL)

BASES DE DATOS SQL MÁS S DE SQL (DML) OPERADOR UNION (L30) <SELECT1> UNION <SELECT2> UNION <SELECTN> Copyright 2006, 2007 Instituto Gala

BASES DE DATOS ACTIVAS

1. Motivación: comportamientos activos. 2. Reglas ECA. Ejemplos BASES DE DATOS ACTIVAS. Las BD tradicionales se consideran pasivas

ÍNDICE INTRODUCCIÓN...13

Maestría en Bioinformática. Bases de Datos y Sistemas de Información. Diseño Lógico. Ing. Alfonso Vicente, PMP alfonso.vicente@logos.com.

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

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

Sistemas de Datos Curso: Ernesto Chinkes. Subconsultas Stored Procedures - Triggers

Lenguaje para descripción de datos

UNIVERSIDAD AUTONOMA DE LOS ANDES UNIANDES LENGUAJE SQL. SQL es un estándar un lenguaje estructurado para consultas

Base de datos relacional

Tema II: El modelo relacional de datos. (2.7) Automatización

Base de Datos Oracle 10g: Introducción a SQL Código: D Duración: 5 días (40 horas)

ÍNDICE PRIMERA PARTE... 17

Procesamiento Condicional con Sentencias IF Procesamiento Condicional con Sentencias CASE Sentencia Loop Simple Sentencia WhileLoop Sentencia ForLoop

Tutorial Oracle SQL Developer 1.2.1

Base de datos Lenguaje SQL

RESTRICCIONES DE DOMINIOS

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

1. DML. Las subconsultas

Oracle Básico PL/SQL

6 - Recuperar algunos registros (where)

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

INSTITUCIÓN EDUCATIVA GABRIEL GARCIA MÁRQUEZ BASE DE DATOS. DESARROLLO DE SOFTWARE Página 1 de 28 SQL SQL

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

Transcripción:

Diseño de Bases de Datos y Seguridad de la Información PL/SQL-1

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

3 Tipos de Disparadores: DML (Fila/Sentencia, BEFORE/AFTER) INSTEAD OF (vistas) SYSTEM PL/SQL-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] Granularidad [WHEN condición] Condición [DECLARE ] BEGIN cuerpo del trigger [EXCEPTION ] END; / Acción PL/SQL-4

Estructura General de un Disparador Ejemplo INVENTARIO (num_producto, descripción, unidades_dispon, punto_pedido, cantidad_pedido) PEDIDOSPENDIENTES (num_producto, cantidad_pedido, fecha_pedido) UPDATE Inventario SET unidades_dispon=unidades_dispon-3 WHERE num_producto=10456; SI el número de unidades disponibles de ese producto (num_producto=10456) en el inventario es inferior al punto de pedido ENTONCES: se genera una nueva orden de pedido INSERT INTO PedidosPendientes VALUES (10456, 100, 1/01/2009 ); PL/SQL-5

Estructura General de un Disparador CREATE OR REPLACE TRIGGER Disparador atributo tabla AFTER UPDATE OF unidades_dispon ON Inventario Evento FOR EACH ROW WHEN (new.unidades_dispon < new.punto_pedido) DECLARE X NUMBER; BEGIN -- Número de pedidos pendientes de ese producto SELECT COUNT(*) INTO X FROM PedidosPendientes WHERE num_producto=:new.num_producto; -- Si no hay ninguna orden de pedido, hacer el pedido IF x = 0 THEN INSERT INTO PedidosPendientes VALUES (:new.num_producto, :new.cantidad_pedido, SYSDATE); END IF; END; Condición Cuando el número de unidades en el inventario sea inferior al punto de pedido. Acción PL/SQL-6

Temporalidad del Evento: AFTER / BEFORE BEFORE Ejecutan la acción asociada antes de que la sentencia sea ejecutada Decidir si la acción debe realizarse o no Utilizar valores alternativos para la sentencia CREATE TRIGGER NombreTrigger BEFORE Insert ON NombreTabla. AFTER Ejecutan la acción asociada después de que se haya ejecutado la sentencia CREATE TRIGGER NombreTrigger AFTER Insert ON NombreTabla. PL/SQL-7

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 UPDATE ON NombreTabla FOR EACH ROW [WHEN ]. A NIVEL DE SENTENCIA: STATEMENT TRIGGERS Ejecutan una única vez la acción asociada, independientemente del número de filas que se vean afectadas por la sentencia (incluso si no hay filas afectadas). CREATE TRIGGER NombreTrigger BEFORE INSERT ON NombreTabla [STATEMENT]... opción por defecto Disparadores en ORACLE Granuralidad del Evento: FOR EACH ROW / STATEMENT PL/SQL-8

Ejemplo: A NIVEL DE FILA (ROW TRIGGER) Cuando Cuando se se borre borre en en la la tabla tabla Persona Persona alguna alguna persona persona que que se se llame llame pepe pepe o cuya cuya edad edad sea sea mayor mayor de de 35 35 años, años, eliminar eliminar también también dicha dicha persona persona de de la la tabla tabla Persona2. 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 DELETE FROM FROM Persona Persona WHERE WHERE cod cod in in ( C1, C3, C4 ) ( C1, C3, C4 ) Borra C3 y C4 de Persona2 PL/SQL-9

Ejemplo: A NIVEL DE SENTENCIA (STATEMENT) Cuando Cuando se se borre borre en en la la tabla tabla Socio Socio emitir emitir un un mensaje mensaje indicando indicando que que no no se se deberían deberían borrar borrar socios socios Socio Cod S1 S2 S3 S4 S5 Nombre Fecha_ant María Pepe Pepe Luisa Pepe............... DELETE DELETE FROM FROM socio socio WHERE WHERE nombre nombre = = Pepe Pepe Borra 3 tuplas y se emite un único mensaje PL/SQL-10

Orden de Ejecución Una sentencia SQL puede disparar varios TRIGGERS. La activación de un trigger puede disparar la activación de otros triggers. 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) Se compromete o se deshace toda la transacción. El orden de ejecución de disparadores del mismo tipo es indeterminado. PL/SQL-11

Condición Expresa una condición que debe cumplirse en el momento de producirse el evento, para que la acción sea ejecutada. Se evalúa para cada fila. WHEN old.nombre = pepe OR old.edad > 35 Debe ser una expresión booleana y no puede contener subconsultas. 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. PL/SQL-12

Correlation Identifiers: Valores OLD y NEW Tipo especial de variable PL/SQL 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 (UPDATE) Al valor NULL para una operación de borrado (DELETE) SINTAXIS Condición (WHEN.) En el cuerpo del disparador OLD, NEW :OLD, :NEW PL/SQL-13

Ejemplo: A NIVEL DE FILA (ROW TRIGGER) Cuando Cuando se se borre borre en en la la tabla tabla Persona Persona alguna alguna persona persona que que se se llame llame pepe pepe o cuya cuya edad edad sea sea mayor mayor de de 35 35 años, años, eliminar eliminar también también dicha dicha persona persona de de la la tabla tabla Persona2. 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 DELETE FROM FROM Persona Persona WHERE WHERE cod cod in in ( C1, C3, C4 ) ( C1, C3, C4 ) Borra C3 y C4 de Persona2 PL/SQL-14

Ejemplo: A NIVEL DE FILA (ROW TRIGGER) CREATE OR REPLACE TRIGGER Disparador AFTER DELETE ON Persona FOR EACH ROW WHEN old.nombre= Pepe OR old.edad>35 BEGIN DELETE FROM Persona2 WHERE Cod=:old.Cod; END Disparador; / NEW OLD Cod Nombre Edad NULL NULL NULL PL/SQL-15

Disparados por sentencias DML (de varios tipos): INSERT or UPDATE or DELETE Todas las filas o sólo algunas (WHEN) LIBROS Disparadores en ORACLE Triggers DML ISBN GÉNERO TÍTULO 100-09-89 Novela El Quijote ----- ---- ---- ESTADÍSTICAS GÉNERO TOTAL_LIBROS Novela 50 Infantil 15 CREATE OR REPLACE TRIGGER UpdateEstadisticasGenero AFTER INSERT OR DELETE OR UPDATE ON Libros DECLARE BEGIN CASE UPDATE Estadisticas SET ---------------------- END UpdateEstadisticasGenero; / PL/SQL-16

Funciones del Cuerpo del Disparador Inserting, Deleting, Updating CREATE OR REPLACE TRIGGER Ejemplo BEFORE INSERT OR UPDATE OR DELETE ON tabla BEGIN IF DELETING THEN Acciones asociadas al borrado ELSIF INSERTING THEN Acciones asociadas a la inserción ELSIF UPDATING( COL1 ) Acciones asociadas a la modificación ELSIF UPDATING( COL2 ) Acciones asociadas a la modificación END IF; END Ejemplo; / PL/SQL-17

Triggers INSTEAD OF Sólo sobre VISTAS EMPLEADO DNI NOMBRE DEPARTAMENTO 11111111 José García CT-1 ----- ---- ---- DEPARTAMENTO NOMBRE Contabilidad - 1 Recursos Humanos CÓDIGO CT-1 RRHH CREATE VIEW EmpleadoDpto as SELECT E.DNI, D.Nombre FROM Empleado E, Departamento D WHERE E.Departamento = D.Código; INSERT INTO EmpleadoDpto VALUES ( 11111111', 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 InsertEmpleadoDpto INSTEAD OF INSERT ON EmpleadoDpto DECLARE V_Cod Departamento.Código%TYPE; BEGIN SELECT Código INTO V_Cod FROM DEPARTAMENTO Where Nombre= :NEW.Nombre; INSERT INTO Departamento VALUES(:NEW.Nombre, V_Cod); INSERT INTO Empleado VALUES(:NEW.DNI,NULL,V_Cod); END; PL/SQL-18 /

Elevar excepciones en el cuerpo del Disparador RAISE_APPLICATION_ ERROR (número_error, mensaje); Número error en el rango: [-20000 y -20999] CREATE OR REPLACE TRIGGER Ejemplo BEFORE DELETE ON tabla FOR EACH ROW BEGIN IF :OLD.columna= valor_no_borrable THEN RAISE_APPLICATION_ERROR(-20000, La fila no se puede borrar ); END IF;... END ejemplo; / PL/SQL-19

Disparados por eventos del Sistema o eventos relacionados con las acciones de los Usuarios Sistema Arranque y parada de BD Transacciones Errores Usuarios Disparadores en ORACLE Triggers de Sistema 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; / PL/SQL-20

Declaración de Variables CREATE... BEFORE AFTER... [FOR EACH ROW...] DECLARE Declaración de variables BEGIN nombre CONSTANT NUMBER:=valor; nombre TIPO; nombre nombretabla.nombrecolumna%type; nombre nombretabla%rowtype PL/SQL-21

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; Borrar un Disparador DROP TRIGGER nombre_disparador; PL/SQL-22

Consultar información sobre los disparadores 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 ; PL/SQL-23

Ejemplo CREATE OR REPLACE TRIGGER Reorder AFTER UPDATE OF Parts_on_hand ON Inventory FOR EACH ROW WHEN (new.parts_on_hand < new.reorder_point) DECLARE x NUMBER; BEGIN SELECT COUNT(*) INTO x FROM Pending_orders WHERE Part_no = :new.part_no; IF x = 0 THEN INSERT INTO Pending_orders VALUES (:new.part_no, :new.reorder_quantity, sysdate); END IF; END; SELECT Trigger_body FROM USER_TRIGGERS WHERE Trigger_name = 'REORDER'; TRIGGER_BODY -------------------------------------------- DECLARE x NUMBER; BEGIN SELECT COUNT(*) INTO x FROM Pending_orders WHERE Part_no = :new.part_no; IF x = 0 THEN INSERT INTO Pending_orders VALUES (:new.part_no, :new.reorder_quantity, sysdate); END IF; END; SELECT Trigger_type, Triggering_event, Table_name FROM USER_TRIGGERS WHERE Trigger_name = 'REORDER'; TYPE TRIGGERING_STATEMENT TABLE_NAME ---------------- -------------------------- ------------ AFTER EACH ROW UPDATE INVENTORY PL/SQL-24

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 no pueden: Leer o actualizar una tabla mutante que esté en la propia declaración del disparador a nivel de fila (ROW TRIGGER) MUTATING TABLE ERROR RUNTIME ERROR PL/SQL-25

Estructura General de un Disparador Ejemplo Asignaturas (nombre_a, descripción, DNI_Profesor) Profesores (DNI, nombre, apellidos) SI el número de asignaturas que imparte un profesor es mayor que 10 ENTONCES se debe impedir dicha asignación y se sacará un mensaje para decir que el profesor está sobrecargado. PL/SQL-26

Tablas Mutantes: ejemplo CREATE OR REPLACE TRIGGER trigger_asignaturas BEFORE INSERT OR UPDATE ON Asignaturas FOR EACH ROW DECLARE BEGIN END; 2008 Belén / Vela Disparadores en ORACLE v_total NUMBER; v_nombre VARCHAR2(30); SELECT COUNT(*) INTO v_total FROM Asignaturas -- ASIGNATURAS está MUTANDO WHERE DNI_Profesor = :NEW.DNI_Profesor; -- comprueba si el profesor está sobrecargado IF v_total >= 10 THEN END IF; EXCEPTION SELECT nombre ' ' apellidos INTO v_nombre FROM Profesores WHERE DNI = :NEW.DNI_Profesor; RAISE_APPLICATION_ERROR (-20000, El profesor ' v_nombre ', está sobrecargado'); WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR (-20001, Datos de profesor incorrectos'); PL/SQL-27

Tablas Mutantes: ejemplo UPDATE Asignaturas SET DNI_Profesor = 000000000 WHERE nombre_a = BD ; UPDATE section * ERROR at line 1: SELECT COUNT(*) INTO v_total FROM Asignaturas WHERE DNI_Profesor = :NEW.DNI_Profesor; ORA-04091: table BD_XX.ASIGNATURAS is mutating, trigger/function may not see it ORA-06512: at "BD_XX.TRIGGER_ASIGNATURAS", line 5 ORA-04088: error during execution of trigger 'BD_XX.TRIGGER_ASIGNATURAS' PL/SQL-28

Tablas Mutantes: solución Crear 2 disparadores En el disparador a nivel de fila (for each row) almacenamos los datos que queremos consultar (los que provocan el error de tabla mutante) En el disparador a nivel de orden (statement) realizamos la consulta (sobre los datos almacenados en lugar de sobre la tabla) La mejor forma de almacenar los valores es utilizar un paquete (opcionalmente, podríamos utilizar una tabla) PL/SQL-29

Tablas Mutantes: solución Trigger a nivel de fila: necesitamos 2 variables globales creamos un paquete guardamos el DNI y el nombre del profesor en estas variables CREATE OR REPLACE PACKAGE pck_profesores AS v_dni_profesor Profesores.DNI%TYPE; v_nombre_profesor varchar2(50); END; PL/SQL-30

Disparadores en ORACLE Tablas Mutantes: solución Buscamos el nombre del profesor y lo metemos en la variable del paquete CREATE OR REPLACE TRIGGER trigger_asignaturas BEFORE INSERT OR UPDATE ON Asignaturas FOR EACH ROW BEGIN IF :NEW.DNI_Profesor IS NOT NULL THEN BEGIN END; END IF; END; pck_profesores.v_dni_profesor := :NEW.DNI_Profesor; 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, Este profesor no existe'); Asignamos el DNI a la variable del paquete PL/SQL-31

Tablas Mutantes: solución TRIGGER a nivel de sentencia realizamos la consulta utilizando las variables globales CREATE OR REPLACE TRIGGER trigger_asignaturas_statement AFTER INSERT OR UPDATE ON Asignaturas DECLARE v_total INTEGER; BEGIN SELECT COUNT(*) INTO v_total FROM Asignaturas WHERE DNI_Profesor = pck_profesores.v_dni_profesor; -- comprobamos si el profesor aludido está sobrecargado IF v_total >= 10 THEN RAISE_APPLICATION_ERROR (-20000, 'El profesor ' pck_profesores.v_nombre_profesor ' está sobrecargado'); END IF; END; PL/SQL-32

Tablas Mutantes: solución UPDATE asignaturas SET DNI = 000000000 WHERE asignaturas_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' PL/SQL-33

Tablas Mutantes: solución cuando hay más de una fila afectada por la instrucción Trigger a nivel de fila: necesitamos una tabla para almacenar las filas modificadas creamos un paquete guardamos el DNI y el nombre del profesor en la variable tipo tabla create or replace package pck_profesores as type datos_profesor is record( v_dni_profesor Profesores.DNI%Type, v_nombre_profesor VARCHAR(50) ); type T_prof is table of datos_profesor index by binary_integer; tabla_profesores T_prof; end pck_profesores; PL/SQL-34

CREATE OR REPLACE TRIGGER trigger_asignaturas BEFORE INSERT OR UPDATE ON Asignaturas FOR EACH ROW DECLARE Indice binary_integer; BEGIN IF :NEW.DNI_Profesor IS NOT NULL THEN BEGIN Disparadores en ORACLE Tablas Mutantes: solución cuando afecta a más de 1 fila Indice:= pck.profesores.tabla_profesores.count+1; pck_profesores.tabla_profesores(indice).dni := :NEW.DNI_Profesor; SELECT nombre ' ' apellidos INTO pck_profesores.tabla_profesores(indice).v_nombre_profesor FROM Profesores WHERE DNI = :NEW.DNI_Profesor; Insertamos el DNI y Nombre en la variable tabla END; END IF; END; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20001,'Este profesor no existe'); PL/SQL-35

TRIGGER a nivel de sentencia:se consulta recorriendo la variable tabla CREATE TRIGGER trigger_asignaturas_statement AFTER INSERT OR UPDATE ON Asignaturas DECLARE v_total INTEGER; Indice binary_integer; nombre_prof varchar(50); BEGIN FOR Indice in 1..pck_profesores.tabla_profesores.count loop END; SELECT COUNT(*) INTO v_total FROM Asignaturas WHERE DNI_Profesor = pck_profesores.tabla_profesores(indice).v_dni_profesor; -- comprobamos si el profesor aludido está sobrecargado IF v_total >= 10 THEN nombre_prof:=pck_profesores.tabla_profesores(indice).v_nombre_profesor; pck_profesores.tabla_profesores.delete; -- vaciar tabla RAISE_APPLICATION_ERROR (-20000, Profesor ' nombre_prof 'sobrecargado'); END IF; END LOOP; Disparadores en ORACLE Tablas Mutantes: solución cuando afecta a más de 1 fila pck_profesores.tabla_profesores.delete; -- vaciar tabla Vaciamos tabla temporal para que sea usado por la siguiente ejecución del disparador PL/SQL-36

Bibliografía Bibliografía Básica Abbey, Corey y Abramson. ORACLE8i: Guía de Aprendizaje (versiones 7.x, 8 y 8i). McGraw-Hill. Urman S. ORACLE 8: Programación PL/SQL. McGraw-Hill. Urman S., Hardman, R., y McLaughlin, M. ORACLE DATABASE 10g. PL/SQL Programming. Oracle Press, 2004. Bibliografía Complementaria Elmasri, R. y Navathe, S. B. Fundamentos de Sistemas de Bases de Datos. Tercera Edición. Addison-Wesley Iberoamericana, 2000. PL/SQL-37

Introducción al lenguaje PL/SQL Diseño de Bases de Datos y Seguridad de la Información PL/SQL-38