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

PRÁCTICA III. DISPARADORES EN SQL (II)

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

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

BASES DE DATOS ACTIVAS

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:

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

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

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

Tema 1. Bases de datos activas

SQL SERVER APLICADO (SSA010)

Disparadores en Oracle (Ejemplos Prácticos)

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

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

PRÁCTICA T2. El lenguaje procedural PL/SQL de Oracle

Unidad III. Bases de Datos

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

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

Existen dos tipos de disparadores que se clasifican según la cantidad de ejecuciones a realizar:

Oracle PL/SQL. Programa de Estudio.

Introducción a PL/SQL

Otros objetos de Base de Datos

Departamento de Lenguajes y Sistemas Informáticos

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

Procedimientos, Funciones, Trigger y Cursores en ORACLE

Introducción a PL/SQL

Tema 5. Lenguaje de Definición de Datos

Introducción a PL/SQL

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

ÍNDICE INTRODUCCIÓN...13

BASES de DATOS ÁCTIVAS

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)

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

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

Base de Datos Oracle 10g: Programación con PL/SQL Código: D Duración: 5 días (40 horas)

T07 Opciones de integridad referencial

Oracle Database: Programación con PL/SQL

Integridad en sistemas de bases de datos relacionales

Estándares para la construcción de Sentencias SQL

Bases de Datos Relacionales y SQL: Una Introducción

Disparadores (triggers)

RESTRICCIONES DE DOMINIOS

Declaración de Variables. Copyright Oracle Corporation, All rights reserved.

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

Instituto Profesional DuocUC Escuela de Ingeniería Uso y contenido del Diccionario 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

Cadena de caracteres Numéricas Fecha y hora Booleanas Tipo registro Tipo cursor

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

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

Disparadores (triggers) en PostgreSQL

GUIA 3 PARTE II. Introducción a PL/SQL

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

Sistemas de Bases de Datos II ITS / ITSB EMT CETP

Cursores, Triggers, Indices, Transacciones, Vistas Gestión y Modelación de Datos

ÍNDICE PRIMERA PARTE... 17

ÍNDICE. Introducción... Capítulo 1. Características, instalación, inicio y entorno de trabajo... 1

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

MANUALITO MS-SQL SERVER

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

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

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

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

Enlaces relacionados:

Laboratorio Informix. Stored Procedures Triggers

1 2 3 ( /! 3 ) +, 1& 3 0))) % &! ( ) +,. / & 0)))

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

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

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

FIREBIRD: SQL PROCEDIMENTAL (PSQL)

Oracle 12c DISEÑO Y PROGRAMACIÓN

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

GBD Diseño físico de DDBB

Acceso a bases de datos MySQL con PHP

Manual de desarrollo en PL/SQL

Introducción 1 Recuperación de Datos mediante la Sentencia SQL SELECT

Haga clic para PostgreS cambiar el estilo

LENGUAJE DE CONSULTA ESTRUCTURADO (SQL)

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

Programando con PL/SQL en una Base de Datos Oracle

SQL SERVER SQL Server 2005 permite tres tipos de operaciones con conjuntos: UNION, disponible en todas las versiones de SQL Server.

TRIGGER LEONEL CADOSO ROMERO 1

Introducción al SQL de InterBase: DDL y DML

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

Manual de Sentencias Básicas en SQL

SUBCONSULTAS SQL. Cuando se ejecuta una consulta que contiene una subconsulta, la subconsulta se ejecuta por cada fila de la consulta principal.

Transcripción:

Diño de Bas de Datos y Seguridad de Información PLSQL-126 PLSQL: lenguaje de programación estructurado en bloques Bloques: unidad mínima en PLSQL 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 optional required EXCEPTION optional required CREATE TRIGGER NombreTrigger BEFORE INSERT ON StarsIn.. TRIGGER CREATE PROCEDURE Get_emp_rec (Emp_number IN Emp_tab.Empno%TYPE) AS - - - - - PROCEDIMIENTO PLSQL-127 1

3 Tipos de Disparadores: DML (FiSentencia, BEFOREAFTER) INSTEAD OF (vistas) SYSTEM PLSQL-128 Estructura General de un Disparador Evento CREATE [OR REPLACE] TRIGGER nombre {BEFORE AFTER INSTEAD OF} Temporalidad del Evento {INSERT DELETE UPDATE [OF <atributo>]} ON <> [FOR EACH ROW STATEMENT] Granuridad [WHEN condición] Condición [ ] cuerpo del trigger [EXCEPTION ] Acción PLSQL-129 2

Ejemplo Estructura General de un Disparador 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 e producto (num_producto=10456) en el inventario es inferior al punto de pedido ENTONCES: genera una nueva orden de pedido INSERT INTO PedidosPendientes VALUES (10456, 100, 1012009 ); PLSQL-130 Estructura General de un Disparador CREATE OR REPLACE TRIGGER Disparador atributo AFTER UPDATE OF unidades_dispon ON Inventario Evento FOR EACH ROW WHEN (new.unidades_dispon < new.punto_pedido) X NUMBER; -- Número de pedidos pendientes de e 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; Condición Cuando el número de unidades en el inventario a inferior al punto de pedido. Acción PLSQL-131 3

Temporalidad del Evento: AFTER BEFORE BEFORE Ejecutan acción asociada antes de que ntencia a ejecutada Decidir si acción debe realizar o no Utilizar valores alternativos para ntencia CREATE TRIGGER NombreTrigger BEFORE Inrt ON NombreTab. AFTER Ejecutan acción asociada después de que haya ejecutado ntencia CREATE TRIGGER NombreTrigger AFTER Inrt ON NombreTab. PLSQL-132 Granuralidad del Evento: FOR EACH ROW STATEMENT A NIVEL DE FILA: ROW TRIGGERS Ejecutan acción asociada tantas veces como fis vean afectadas por ntencia que lo dispara Si ninguna fi ve afectada, no dispara CREATE TRIGGER NombreTrigger BEFORE UPDATE ON NombreTab FOR EACH ROW [WHEN ]. A NIVEL DE SENTENCIA: STATEMENT TRIGGERS Ejecutan una única vez acción asociada, independientemente del número de fis que vean afectadas por ntencia (incluso si no hay fis afectadas). CREATE TRIGGER NombreTrigger BEFORE INSERT ON NombreTab [STATEMENT]... opción por defecto PLSQL-133 4

Ejemplo: A NIVEL DE FILA (ROW TRIGGER) Cuando Cuando borre borre en en alguna alguna persona persona que que lme lme pepe pepe o cuya cuya edad edad a a mayor mayor de de 35 35 años, años, eliminar eliminar también también dicha dicha persona persona de de 2. 2. Cod Nombre Edad C1 C2 C3 C4 C5 María Luisa 25 40 45 48 22 2 Cod Nombre Edad C1 C2 C3 C4 C5 María Luisa 25 40 45 48 22 DELETE DELETE FROM FROM WHERE WHERE cod cod in in ( C1, C3, C4 ) ( C1, C3, C4 ) Borra C3 y C4 de 2 PLSQL-134 Ejemplo: A NIVEL DE SENTENCIA (STATEMENT) Cuando Cuando borre borre en en Socio Socio emitir emitir un un mensaje mensaje indicando indicando que que no no deberían deberían borrar borrar socios socios Socio Cod S1 S2 S3 S4 S5 Nombre Fecha_ant María Luisa............... DELETE DELETE FROM FROM socio socio WHERE WHERE nombre nombre = = Borra 3 tups y emite un único mensaje PLSQL-135 5

Orden de Ejecución Una ntencia SQL puede disparar varios TRIGGERS. La activación de un trigger puede disparar activación de otros triggers. 1. Triggers Before (a nivel de ntencia) 2. Para cada fi: 1. Trigger Before (a nivel de fi) 2. Ejecuta Sentencia 3. Triggers After (a nivel de fi) 3. Triggers After (a nivel de ntencia) Se compromete o deshace toda transacción. El orden de ejecución de disparadores del mismo tipo es indeterminado. PLSQL-136 Condición Expresa una condición que debe cumplir en el momento de producir el evento, para que acción a ejecutada. Se evalúa para cada fi. WHEN old.nombre = pepe OR old.edad > 35 Debe r una expresión booleana y no puede contener subconsultas. Se puede utilizar cualquier combinación de operadores lógicos (AND, OR, NOT) y recionales (< <= > >= = <>). No puede especificar una condición para los disparadores a nivel de ntencia (STATEMENT) ni los disparadores INSTEAD OF. PLSQL-137 6

Corretion Identifiers: Valores OLD y NEW Tipo especial de variable PLSQL tratada como un registro de tipo _modificada%rowtype Con OLD.nombre_columna referenciamos: al valor que tenía columna antes del cambio debido a una modificación (UPDATE) al valor de una columna antes de una operación de borrado sobre misma (DELETE) al valor NULL para operaciones de inrción (INSERT) Con NEW.nombre_columna referenciamos: Al valor de una nueva columna después de una operación de inrción (INSERT) Al valor de una columna después de modificar mediante una ntencia 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 PLSQL-138 Ejemplo: A NIVEL DE FILA (ROW TRIGGER) Cuando Cuando borre borre en en alguna alguna persona persona que que lme lme pepe pepe o cuya cuya edad edad a a mayor mayor de de 35 35 años, años, eliminar eliminar también también dicha dicha persona persona de de 2. 2. Cod Nombre Edad C1 C2 C3 C4 C5 María Luisa 25 40 45 48 22 2 Cod Nombre Edad C1 C2 C3 C4 C5 María Luisa 25 40 45 48 22 DELETE DELETE FROM FROM WHERE WHERE cod cod in in ( C1, C3, C4 ) ( C1, C3, C4 ) Borra C3 y C4 de 2 PLSQL-139 7

Ejemplo: A NIVEL DE FILA (ROW TRIGGER) CREATE OR REPLACE TRIGGER Disparador AFTER DELETE ON FOR EACH ROW WHEN old.nombre= OR old.edad>35 DELETE FROM 2 WHERE Cod=:old.Cod; Cod Nombre Edad END Disparador; NEW NULL NULL NULL OLD PLSQL-140 Disparados por ntencias DML (de varios tipos): INSERT or UPDATE or DELETE Todas s fis o sólo algunas (WHEN) LIBROS ISBN 100-09-89 ----- Triggers DML GÉNERO Nove ---- TÍTULO El Quijote ---- ESTADÍSTICAS GÉNERO Nove Infantil TOTAL_LIBROS 50 15 CREATE OR REPLACE TRIGGER UpdateEstadisticasGenero AFTER INSERT OR DELETE OR UPDATE ON Libros CASE UPDATE Estadisticas SET ---------------------- END UpdateEstadisticasGenero; PLSQL-141 8

Funciones del Cuerpo del Disparador Inrting, Deleting, Updating CREATE OR REPLACE TRIGGER Ejemplo BEFORE INSERT OR UPDATE OR DELETE ON IF DELETING THEN Acciones asociadas al borrado ELSIF INSERTING THEN Acciones asociadas a inrción ELSIF UPDATING( COL1 ) Acciones asociadas a modificación ELSIF UPDATING( COL2 ) Acciones asociadas a modificación END IF; END Ejemplo; PLSQL-142 Triggers INSTEAD OF Sólo sobre VISTAS EMPLEADO DEPARTAMENTO DNI NOMBRE DEPARTAMENTO NOMBRE CÓDIGO 11111111 José García CT-1 Contabilidad - 1 CT-1 ----- ---- ---- Recursos Humanos 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 puede modificar una columna que corresponde con una no rervada por cve CREATE OR REPLACE TRIGGER InrtEmpleadoDpto INSTEAD OF INSERT ON EmpleadoDpto V_Cod Departamento.Código%TYPE; 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); PLSQL-143 9

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 FOR EACH ROW IF :OLD.columna= valor_no_borrable THEN RAISE_APPLICATION_ERROR(-20000, La fi no puede borrar ); END IF;... END ejemplo; PLSQL-144 Triggers de Sistema Disparados por eventos del Sistema o eventos recionados con s acciones de los Usuarios Sistema Arranque y parada de BD Transacciones Errores Usuarios Login Logoff Sentencias DDL: CREATE, ALTER, DROP, CREATE OR REPLACE TRIGGER LogCreations AFTER CREATE ON SCHEMA INSERT INTO LogCreates (ur_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; PLSQL-145 10

Decración de Variables CREATE... BEFORE AFTER... [FOR EACH ROW...] Decración de variables nombre CONSTANT NUMBER:=valor; nombre TIPO; nombre nombre.nombrecolumna%type; nombre nombre%rowtype PLSQL-146 ActivarDesactivar Disparadores Todos los disparadores asociados a una : ALTER TABLE nombre_ ENABLE ALL TRIGGERS; ALTER TABLE nombre_ DISABLE ALL TRIGGERS; (Por defecto: Todos están Activados al crear) Un disparador específico: ALTER TRIGGER nombre_disparador ENABLE; ALTER TRIGGER nombre_disparador DISABLE; Borrar un Disparador DROP TRIGGER nombre_disparador; PLSQL-147 11

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 descripción de un disparador SELECT DESCRIPTION FROM USER_TRIGGERS WHERE TRIGGER_NAME= nombre_disparador ; PLSQL-148 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) x NUMBER; 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; SELECT Trigger_body FROM USER_TRIGGERS WHERE Trigger_name = 'REORDER'; TRIGGER_BODY -------------------------------------------- x NUMBER; 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; SELECT Trigger_type, Triggering_event, Table_name FROM USER_TRIGGERS WHERE Trigger_name = 'REORDER'; TYPE TRIGGERING_STATEMENT TABLE_NAME ---------------- -------------------------- ------------ AFTER EACH ROW UPDATE INVENTORY PLSQL-149 12

Restricciones: Tabs Mutantes Tab mutante (mutating) que está siendo modificada por una operación DML que verá afectada por los efectos de un DELETE CASCADE debido a integridad referencial (hasta Oracle8i). Las órdenes del cuerpo de un disparador no pueden: Leer o actualizar una mutante que esté en propia decración del disparador a nivel de fi (ROW TRIGGER) MUTATING TABLE ERROR RUNTIME ERROR PLSQL-150 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 debe impedir dicha asignación y sacará un mensaje para decir que el profesor está sobrecargado. PLSQL-151 13

Tabs Mutantes: ejemplo CREATE OR REPLACE TRIGGER trigger_asignaturas BEFORE INSERT OR UPDATE ON Asignaturas FOR EACH ROW 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 SELECT nombre ' ' apellidos INTO v_nombre FROM Profesores WHERE DNI = :NEW.DNI_Profesor; RAISE_APPLICATION_ERROR (-20000, El profesor ' v_nombre ', está sobrecargado'); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR (-20001, Datos de profesor incorrectos'); 2008 Belén Ve PLSQL-152 Tabs Mutantes: ejemplo UPDATE Asignaturas SET DNI_Profesor = 000000000 WHERE nombre_a = BD ; SELECT COUNT(*) UPDATE ction INTO v_total * FROM Asignaturas WHERE DNI_Profesor = :NEW.DNI_Profesor; ERROR at line 1: ORA-04091: table BD_XX.ASIGNATURAS is mutating, triggerfunction may not e it ORA-06512: at "BD_XX.TRIGGER_ASIGNATURAS", line 5 ORA-04088: error during execution of trigger 'BD_XX.TRIGGER_ASIGNATURAS' PLSQL-153 14

Tabs Mutantes: solución Crear 2 disparadores En el disparador a nivel de fi (for each row) almacenamos los datos que queremos consultar (los que provocan el error de mutante) En el disparador a nivel de orden (statement) realizamos consulta (sobre los datos almacenados en lugar de sobre ) La mejor forma de almacenar los valores es utilizar un paquete (opcionalmente, podríamos utilizar una ) PLSQL-154 Tabs Mutantes: solución Trigger a nivel de fi: 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); PLSQL-155 15

Tabs Mutantes: solución Buscamos el nombre del profesor y lo metemos en variable del paquete CREATE OR REPLACE TRIGGER trigger_asignaturas BEFORE INSERT OR UPDATE ON Asignaturas FOR EACH ROW IF :NEW.DNI_Profesor IS NOT NULL THEN 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 END IF; RAISE_APPLICATION_ERROR(-20001, Este profesor no existe'); Asignamos el DNI a variable del paquete PLSQL-156 Tabs Mutantes: solución TRIGGER a nivel de ntencia realizamos consulta utilizando s variables globales CREATE OR REPLACE TRIGGER trigger_asignaturas_statement AFTER INSERT OR UPDATE ON Asignaturas v_total INTEGER; 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; PLSQL-157 16

Tabs 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' PLSQL-158 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 PLSQL. McGraw-Hill. Urman S., Hardman, R., y McLaughlin, M. ORACLE DATABASE 10g. PLSQL Programming. Oracle Press, 2004. Bibliografía Complementaria Elmasri, R. y Navathe, S. B. Fundamentos de Sistemas de Bas de Datos. Tercera Edición. Addison-Wesley Iberoamericana, 2000. PLSQL-159 17