belen disparadores oracle

38
© 2008 Belén Vela PL/SQL-1 Disparadores en ORACLE Diseño de Bases de Datos y Seguridad de la Información

Upload: hernadez-jorge

Post on 19-Oct-2015

13 views

Category:

Documents


2 download

TRANSCRIPT

  • 2008 Beln VelaPL/SQL-1

    Disparadores en ORACLE

    Diseo de Bases de Datos y Seguridad de la Informacin

  • 2008 Beln VelaPL/SQL-2

    Disparadores en ORACLE

    PL/SQL: lenguaje de programacin estructurado en bloques

    Bloques: unidad mnima en PL/SQL

    Soportan DML y DDL

    Annimos / Con nombre

    Disparadores (triggers) en Oracle: bloques de cdigo que son implcitamente invocados cuando algo sucede

    Triggers vs. Procedimientos Ejecucin implcita: Disparar

    No admiten argumentos

    Aplicaciones

    Restricciones (Constraints)

    Auditoras

    Informar de eventos

    DECLARE optional

    BEGIN required

    EXCEPTION optional

    END; required/

    CREATE PROCEDURE Get_emp_rec(Emp_number IN Emp_tab.Empno%TYPE) ASBEGIN

    - - - - -

    END;/

    CREATE TRIGGER NombreTriggerBEFORE INSERT ON StarsInDECLARE

    ..

    END;/

    TRIGGER

    PROCEDIMIENTO

  • 2008 Beln VelaPL/SQL-3

    3 Tipos de Disparadores:

    DML (Fila/Sentencia, BEFORE/AFTER)

    INSTEAD OF (vistas) SYSTEM

    Disparadores en ORACLE

  • 2008 Beln VelaPL/SQL-4

    Disparadores en ORACLE

    Estructura General de un Disparador

    CREATE [OR REPLACE] TRIGGER nombre{BEFORE | AFTER | INSTEAD OF} Temporalidad del Evento{INSERT | DELETE | UPDATE [OF ]} ON

    [FOR EACH ROW | STATEMENT] Granularidad[WHEN condicin][DECLARE]BEGIN

    cuerpo del trigger[EXCEPTION]END;/

    EventoEvento

    CondiciCondicinn

    AcciAccinn

  • 2008 Beln VelaPL/SQL-5

    Disparadores en ORACLE

    Ejemplo

    Estructura General de un Disparador

    INVENTARIO (num_producto, descripcin, unidades_dispon, punto_pedido, cantidad_pedido)

    PEDIDOSPENDIENTES (num_producto, cantidad_pedido, fecha_pedido)

    UPDATE InventarioSET unidades_dispon=unidades_dispon-3WHERE num_producto=10456;

    INSERT INTO PedidosPendientes VALUES (10456, 100, 1/01/2009 );

    SI el nmero de unidades disponibles de ese producto (num_producto=10456) en el inventario es inferior al punto de pedidoENTONCES: se genera una nueva orden de pedido

  • 2008 Beln VelaPL/SQL-6

    Disparadores en ORACLE

    AFTER UPDATE OF unidades_dispon ON Inventario

    FOR EACH ROWWHEN (new.unidades_dispon < new.punto_pedido)

    DECLAREX NUMBER;

    BEGIN-- Nmero de pedidos pendientes de ese producto

    SELECT COUNT(*) INTO X FROM PedidosPendientesWHERE num_producto=:new.num_producto;-- Si no hay ninguna orden de pedido, hacer el pedido IF x = 0 THEN

    INSERT INTO PedidosPendientesVALUES (:new.num_producto, :new.cantidad_pedido, SYSDATE);

    END IF;END;

    EventoEvento

    CondiciCondicinn

    AcciAccinn

    atributo tabla

    Cuando el nmero de unidades en el inventario sea inferior al punto de pedido.

    CREATE OR REPLACE TRIGGER Disparador

    Estructura General de un Disparador

  • 2008 Beln VelaPL/SQL-7

    BEFOREEjecutan la accin asociada antes de que la sentencia sea ejecutada

    Decidir si la accin debe realizarse o no

    Utilizar valores alternativos para la sentencia

    CREATE TRIGGER NombreTrigger

    BEFORE Insert ON NombreTabla .

    AFTEREjecutan la accin asociada despus de que se haya ejecutado la sentencia

    CREATE TRIGGER NombreTrigger

    AFTER Insert ON NombreTabla .

    Disparadores en ORACLE

    Temporalidad del Evento: AFTER / BEFORE

  • 2008 Beln VelaPL/SQL-8

    A NIVEL DE FILA: ROW TRIGGERSEjecutan la accin 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 TRIGGERSEjecutan una nica vez la accin asociada, independientemente del nmero de filas que se vean afectadas por la sentencia (incluso si no hay filas afectadas).

    CREATE TRIGGER NombreTrigger

    BEFORE INSERT ON NombreTabla

    [STATEMENT] . . . opcin por defecto

    Disparadores en ORACLE

    Granuralidad del Evento:FOR EACH ROW / STATEMENT

  • 2008 Beln VelaPL/SQL-9

    Ejemplo: A NIVEL DE FILA (ROW TRIGGER)

    Disparadores en ORACLE

    PersonaCod Nombre Edad

    C1C2C3C4C5

    MaraPepePepeLuisaPepe

    2540454822

    Persona2Cod Nombre Edad

    C1C2C3C4C5

    MaraPepePepeLuisaPepe

    2540454822

    Cuando se borre en la tabla Persona alguna persona quese llame pepe o cuya edad sea mayor de 35 aos, eliminar tambin dicha persona de la tabla Persona2.

    Cuando se borre en la tabla Persona alguna persona quese llame pepe o cuya edad sea mayor de 35 aos, eliminar tambin dicha persona de la tabla Persona2.

    DELETE FROM PersonaWHERE cod in (C1,C3,C4) DELETE FROM PersonaWHERE cod in (C1,C3,C4)

    Borra C3 y C4de Persona2

  • 2008 Beln VelaPL/SQL-10

    Disparadores en ORACLE

    Ejemplo: A NIVEL DE SENTENCIA (STATEMENT)

    SocioCod Nombre Fecha_ant

    S1S2S3S4S5

    MaraPepePepeLuisaPepe

    ......

    ......

    ......

    ......

    ......

    Cuando se borre en la tabla Socio emitir un mensaje indicando que no se deberan borrar socios

    Cuando se borre en la tabla Socio emitir un mensaje indicando que no se deberan borrar socios

    DELETE FROM socioWHERE nombre = Pepe

    DELETE FROM socioWHERE nombre = Pepe

    Borra 3 tuplas y se emiteun nico mensaje

  • 2008 Beln VelaPL/SQL-11

    Una sentencia SQL puede disparar varios TRIGGERS.

    La activacin de un trigger puede disparar la activacin 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 transaccin.

    El orden de ejecucin de disparadores del mismo tipo es indeterminado.

    Disparadores en ORACLE

    Orden de Ejecucin

  • 2008 Beln VelaPL/SQL-12

    Expresa una condicin que debe cumplirse en el momento de producirse el evento, para que la accin sea ejecutada. Se evala para cada fila.

    WHEN old.nombre = pepe OR old.edad > 35

    Debe ser una expresin booleana y no puede contener subconsultas.

    Se puede utilizar cualquier combinacin de operadores lgicos (AND, OR, NOT) y relacionales (< >= = ).

    No se puede especificar una condicin para los disparadores a nivel de sentencia (STATEMENT) ni los disparadores INSTEAD OF.

    Disparadores en ORACLE

    Condicin

  • 2008 Beln VelaPL/SQL-13

    Disparadores en ORACLE

    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 tena la columna antes del cambio debido a una modificacin

    (UPDATE) al valor de una columna antes de una operacin de borrado sobre la misma

    (DELETE) al valor NULL para operaciones de insercin (INSERT)

    Con NEW.nombre_columna referenciamos: Al valor de una nueva columna despus de una operacin de insercin

    (INSERT) Al valor de una columna despus de modificarla mediante una sentencia de

    modificacin (UPDATE) Al valor NULL para una operacin de borrado (DELETE)

    Condicin (WHEN .) OLD, NEWEn el cuerpo del disparador :OLD, :NEWSINTAXIS

  • 2008 Beln VelaPL/SQL-14

    Ejemplo: A NIVEL DE FILA (ROW TRIGGER)

    Disparadores en ORACLE

    PersonaCod Nombre Edad

    C1C2C3C4C5

    MaraPepePepeLuisaPepe

    2540454822

    Persona2Cod Nombre Edad

    C1C2C3C4C5

    MaraPepePepeLuisaPepe

    2540454822

    Cuando se borre en la tabla Persona alguna persona quese llame pepe o cuya edad sea mayor de 35 aos, eliminar tambin dicha persona de la tabla Persona2.

    Cuando se borre en la tabla Persona alguna persona quese llame pepe o cuya edad sea mayor de 35 aos, eliminar tambin dicha persona de la tabla Persona2.

    DELETE FROM PersonaWHERE cod in (C1,C3,C4) DELETE FROM PersonaWHERE cod in (C1,C3,C4)

    Borra C3 y C4de Persona2

  • 2008 Beln VelaPL/SQL-15

    Ejemplo: A NIVEL DE FILA (ROW TRIGGER)

    Disparadores en ORACLE

    CREATE OR REPLACE TRIGGER DisparadorAFTER DELETE ON PersonaFOR EACH ROWWHEN old.Nombre=Pepe OR old.Edad>35BEGIN

    DELETE FROM Persona2 WHERE Cod=:old.Cod;

    END Disparador;/

    Cod Nombre Edad

    NEW

    OLD

    NULL NULL NULL

  • 2008 Beln VelaPL/SQL-16

    Disparados por sentencias DML (de varios tipos): INSERT or UPDATE or DELETE

    Todas las filas o slo algunas (WHEN)

    ISBN GNERO TTULO

    100-09-89 Novela El Quijote

    ----- ---- ----

    GNERO TOTAL_LIBROS

    Novela 50

    Infantil 15

    LIBROS ESTADSTICAS

    Disparadores en ORACLE

    Triggers DML

    CREATE OR REPLACE TRIGGER UpdateEstadisticasGeneroAFTER INSERT OR DELETE OR UPDATE ON LibrosDECLARE

    BEGIN

    CASE

    UPDATE Estadisticas SET ----------------------

    END UpdateEstadisticasGenero;/

  • 2008 Beln VelaPL/SQL-17

    Disparadores en ORACLE

    Funciones del Cuerpo del Disparador

    CREATE OR REPLACE TRIGGER EjemploBEFORE INSERT OR UPDATE OR DELETE ON tablaBEGIN

    IF DELETING THENAcciones asociadas al borrado

    ELSIF INSERTING THEN Acciones asociadas a la insercin

    ELSIF UPDATING(COL1)Acciones asociadas a la modificacin

    ELSIF UPDATING(COL2)Acciones asociadas a la modificacin

    END IF;END Ejemplo;/

    Inserting, Deleting, Updating

  • 2008 Beln VelaPL/SQL-18

    Slo sobre VISTAS

    DNI NOMBRE DEPARTAMENTO

    11111111 Jos Garca CT-1

    ----- ---- ----

    NOMBRE CDIGO

    Contabilidad - 1 CT-1

    Recursos Humanos RRHH

    EMPLEADO DEPARTAMENTO

    CREATE VIEW EmpleadoDpto as

    SELECT E.DNI, D.Nombre FROM Empleado E, Departamento D

    WHERE E.Departamento = D.Cdigo;

    INSERT INTO EmpleadoDptoVALUES (11111111', Contabilidad-1);

    ERROR en lnea 1:ORA-01779: no se puede modificar una columna quese corresponde con una tabla no reservada por clave

    CREATE OR REPLACE TRIGGER InsertEmpleadoDptoINSTEAD OF INSERT ON EmpleadoDptoDECLAREV_Cod Departamento.Cdigo%TYPE;BEGINSELECT Cdigo INTO V_Cod FROM DEPARTAMENTOWhere Nombre= :NEW.Nombre;INSERT INTO Departamento VALUES(:NEW.Nombre, V_Cod);INSERT INTO Empleado VALUES(:NEW.DNI,NULL,V_Cod);END;

    /

    Disparadores en ORACLE

    Triggers INSTEAD OF

  • 2008 Beln VelaPL/SQL-19

    RAISE_APPLICATION_ ERROR (nmero_error, mensaje);

    Nmero error en el rango: [-20000 y -20999]

    Disparadores en ORACLE

    Elevar excepciones en el cuerpo del Disparador

    CREATE OR REPLACE TRIGGER EjemploBEFORE DELETE ON tablaFOR EACH ROWBEGIN

    IF :OLD.columna= valor_no_borrable THENRAISE_APPLICATION_ERROR(-20000,La fila no se puede borrar);

    END IF;...

    END ejemplo;/

  • 2008 Beln VelaPL/SQL-20

    Disparados por eventos del Sistema o eventos relacionados con las acciones de los Usuarios

    Sistema

    Arranque y parada de BD

    Transacciones

    Errores

    Usuarios

    Login / Logoff

    Sentencias DDL: CREATE, ALTER, DROP,

    Disparadores en ORACLE

    Triggers de Sistema

    CREATE OR REPLACE TRIGGER LogCreationsAFTER CREATE ON SCHEMA

    BEGININSERT 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;/

  • 2008 Beln VelaPL/SQL-21

    nombre CONSTANT NUMBER:=valor;

    nombre TIPO;

    nombre nombretabla.nombrecolumna%TYPE;

    nombre nombretabla%ROWTYPE

    Disparadores en ORACLE

    Declaracin de Variables

    CREATE...BEFORE | AFTER ...[FOR EACH ROW ...]DECLARE

    Declaracin de variablesBEGIN

  • 2008 Beln VelaPL/SQL-22

    Todos los disparadores asociados a una tabla:

    ALTER TABLE nombre_tabla ENABLE ALL TRIGGERS;

    ALTER TABLE nombre_tabla DISABLE ALL TRIGGERS;

    (Por defecto: Todos estn Activados al crearse)

    Un disparador especfico:

    ALTER TRIGGER nombre_disparador ENABLE;

    ALTER TRIGGER nombre_disparador DISABLE;

    Disparadores en ORACLE

    Activar/Desactivar Disparadores

    DROP TRIGGER nombre_disparador;

    Borrar un Disparador

  • 2008 Beln VelaPL/SQL-23

    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 descripcin de un disparador

    SELECT DESCRIPTION FROM USER_TRIGGERS WHERE TRIGGER_NAME= nombre_disparador;

    Disparadores en ORACLE

    Consultar informacin sobre los disparadores

  • 2008 Beln VelaPL/SQL-24

    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_type, Triggering_event, Table_name

    FROM USER_TRIGGERS

    WHERE Trigger_name = 'REORDER';

    TYPE TRIGGERING_STATEMENT TABLE_NAME

    ---------------- -------------------------- ------------

    AFTER EACH ROW UPDATE INVENTORY

    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;

    Disparadores en ORACLE

    Ejemplo

  • 2008 Beln VelaPL/SQL-25

    Disparadores en ORACLE

    Restricciones: Tablas Mutantes

    Tabla mutante (mutating) tabla que est siendo modificada por una operacin 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 nopueden: Leer o actualizar una tabla mutante que est en la propia

    declaracin del disparador a nivel de fila (ROW TRIGGER) MUTATING TABLE ERROR RUNTIME ERROR

  • 2008 Beln VelaPL/SQL-26

    Disparadores en ORACLE

    Ejemplo

    Estructura General de un Disparador

    SI el nmero de asignaturas que imparte un profesor es mayor que 10

    ENTONCES se debe impedir dicha asignacin y se sacar un mensaje para decir que el profesor est sobrecargado.

    Asignaturas (nombre_A, descripcin, DNI_Profesor)

    Profesores (DNI, nombre, apellidos)

  • 2008 Beln VelaPL/SQL-27

    Tablas Mutantes: ejemploCREATE OR REPLACE TRIGGER trigger_asignaturasBEFORE INSERT OR UPDATE ON AsignaturasFOR EACH ROW

    DECLARE

    v_total NUMBER;v_nombre VARCHAR2(30);

    BEGIN

    SELECT COUNT(*)INTO v_totalFROM Asignaturas -- ASIGNATURAS est MUTANDOWHERE DNI_Profesor = :NEW.DNI_Profesor;

    -- comprueba si el profesor est sobrecargadoIF v_total >= 10 THEN

    SELECT nombre||' '||apellidosINTO v_nombreFROM 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');END;

    /

    Disparadores en ORACLE

  • 2008 Beln VelaPL/SQL-28

    UPDATE AsignaturasSET DNI_Profesor = 000000000WHERE nombre_A = BD;

    UPDATE section

    *

    ERROR at line 1:

    ORA-04091: table BD_XX.ASIGNATURAS is mutating, trigger/function may not see itORA-06512: at "BD_XX.TRIGGER_ASIGNATURAS", line 5

    ORA-04088: error during execution of trigger'BD_XX.TRIGGER_ASIGNATURAS'

    SELECT COUNT(*)

    INTO v_total

    FROM Asignaturas

    WHERE DNI_Profesor = :NEW.DNI_Profesor;

    Disparadores en ORACLE

    Tablas Mutantes: ejemplo

  • 2008 Beln VelaPL/SQL-29

    Tablas Mutantes: solucin

    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, podramos utilizar una

    tabla)

    Disparadores en ORACLE

  • 2008 Beln VelaPL/SQL-30

    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;

    Disparadores en ORACLE

    Tablas Mutantes: solucin

  • 2008 Beln VelaPL/SQL-31

    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

    pck_profesores.v_DNI_profesor := :NEW.DNI_Profesor;

    SELECT nombre||' '||apellidosINTO 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');

    END;

    END IF;

    END;

    Disparadores en ORACLE

    Tablas Mutantes: solucin

    Asignamos el DNI a la variable del paquete

    Buscamos el nombre del profesor y lo metemos en la variable del paquete

  • 2008 Beln VelaPL/SQL-32

    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_totalFROM Asignaturas

    WHERE DNI_Profesor = pck_profesores.v_DNI_profesor;

    -- comprobamos si el profesor aludido est sobrecargadoIF v_total >= 10 THEN

    RAISE_APPLICATION_ERROR (-20000, 'El profesor '||pck_profesores.v_nombre_profesor || ' est sobrecargado');

    END IF;

    END;

    Disparadores en ORACLE

    Tablas Mutantes: solucin

  • 2008 Beln VelaPL/SQL-33

    UPDATE asignaturasSET DNI = 000000000WHERE asignaturas_id = BD;

    UPDATE asignaturas

    *

    ERROR at line 1:ORA-20000: El profesor Carlos Romero est sobrecargadoORA-06512: at "BD_XX.TRIGGER_ASIGNATURAS_STATEMENT", line 11ORA-04088: error during execution of trigger'BD_XX.TRIGGER_ASIGNATURAS_STATEMENT'

    Disparadores en ORACLE

    Tablas Mutantes: solucin

  • 2008 Beln VelaPL/SQL-34

    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 astype 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;

    Disparadores en ORACLE

    Tablas Mutantes: solucin cuando hay ms de una fila afectada por la instruccin

  • 2008 Beln VelaPL/SQL-35

    CREATE OR REPLACE TRIGGER trigger_asignaturas BEFORE INSERT OR UPDATE ON AsignaturasFOR EACH ROWDECLAREIndice binary_integer;BEGINIF :NEW.DNI_Profesor IS NOT NULL THEN BEGINIndice:= pck.profesores.tabla_profesores.COUNT+1;pck_profesores.tabla_profesores(Indice).DNI := :NEW.DNI_Profesor; SELECT nombre||' '||apellidosINTO pck_profesores.tabla_profesores(Indice).v_nombre_profesorFROM ProfesoresWHERE DNI = :NEW.DNI_Profesor;

    EXCEPTIONWHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20001,'Este profesor no existe');

    END;END IF;

    END;

    Disparadores en ORACLE

    Tablas Mutantes: solucin cuando afecta a ms de 1 fila

    Insertamos el DNI y Nombre en la variable

    tabla

  • 2008 Beln VelaPL/SQL-36

    TRIGGER a nivel de sentencia:se consulta recorriendo la variable tabla

    CREATE TRIGGER trigger_asignaturas_statement AFTER INSERT OR UPDATE ON AsignaturasDECLARE v_total INTEGER;Indice binary_integer;nombre_prof varchar(50);

    BEGIN FOR Indice in 1..pck_profesores.tabla_profesores.count loop

    SELECT COUNT(*) INTO v_totalFROM Asignaturas WHERE DNI_Profesor =

    pck_profesores.tabla_profesores(Indice).v_DNI_profesor;-- comprobamos si el profesor aludido est sobrecargadoIF v_total >= 10 THENnombre_prof:=pck_profesores.tabla_profesores(Indice).v_nombre_profesor;pck_profesores.tabla_profesores.delete; -- vaciar tablaRAISE_APPLICATION_ERROR (-20000, Profesor '||nombre_prof|| 'sobrecargado');

    END IF;

    END LOOP;pck_profesores.tabla_profesores.delete; -- vaciar tabla

    END;

    Disparadores en ORACLE

    Tablas Mutantes: solucin cuando afecta a ms de 1 fila

    Vaciamos tabla temporal para que sea usado por la siguiente ejecucin del

    disparador

  • 2008 Beln VelaPL/SQL-37

    Bibliografa

    Bibliografa BsicaAbbey, Corey y Abramson. ORACLE8i: Gua de Aprendizaje (versiones 7.x, 8 y 8i). McGraw-Hill.Urman S. ORACLE 8: Programacin PL/SQL. McGraw-Hill. Urman S., Hardman, R., y McLaughlin, M. ORACLE DATABASE 10g. PL/SQL Programming. Oracle Press, 2004.

    Bibliografa ComplementariaElmasri, R. y Navathe, S. B. Fundamentos de Sistemas de Bases de Datos. Tercera Edicin. Addison-Wesley Iberoamericana, 2000.

  • 2008 Beln VelaPL/SQL-38

    Introduccin al lenguaje PL/SQL

    Diseo de Bases de Datos y Seguridad de la Informacin