Professional Documents
Culture Documents
PL/SQL-1
Disparadores en ORACLE
PL/SQL: lenguaje de programacin estructurado en bloques Bloques: unidad mnima en PL/SQL
Soportan DML y DDL Annimos / Con nombre
DECLARE optional BEGIN required EXCEPTION optional END; required /
Disparadores (triggers) en Oracle: bloques de cdigo que son implcitamente invocados cuando algo sucede Triggers vs. Procedimientos
Ejecucin implcita: Disparar No admiten argumentos
CREATE TRIGGER NombreTrigger BEFORE INSERT ON StarsIn DECLARE .. END; TRIGGER /
Aplicaciones
Restricciones (Constraints) Auditoras Informar de eventos
Disparadores en ORACLE
PL/SQL-3
Evento
Granularidad
Condicin
Accin
PL/SQL-4
PL/SQL-5
Evento Condicin
Cuando el nmero de unidades en el inventario sea inferior al punto de pedido. DECLARE X NUMBER; Accin BEGIN -- Nmero 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; 2008 Beln END; Vela PL/SQL-6
PL/SQL-7
Disparadores en ORACLE
Ejemplo: A NIVEL DE FILA (ROW TRIGGER) Cuando Cuandose seborre borreen enla latabla tablaPersona Personaalguna algunapersona personaque que se sellame llamepepe pepeo ocuya cuyaedad edadsea seamayor mayorde de35 35aos, aos, eliminar eliminartambin tambindicha dichapersona personade dela latabla tablaPersona2. Persona2.
Persona2 Cod
C1 C2 C3 C4 C5
Nombre Edad
Mara Pepe Pepe Luisa Pepe 25 40 45 48 22
DELETE DELETE FROM FROM Persona Persona WHERE cod in WHERE cod in (C1,C3,C4) (C1,C3,C4)
Borra C3 y C4 de Persona2
PL/SQL-9
Disparadores en ORACLE
Ejemplo: A NIVEL DE SENTENCIA (STATEMENT) Cuando Cuandose seborre borreen enla latabla tablaSocio Socioemitir emitirun un mensaje mensajeindicando indicandoque queno nose sedeberan deberanborrar borrarsocios socios
DELETE DELETE FROM FROM socio socio WHERE nombre WHERE nombre = = Pepe Pepe
2008 Beln Vela
1. 2.
3.
Se compromete o se deshace toda la transaccin. El orden de ejecucin de disparadores del mismo tipo es indeterminado.
PL/SQL-11
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.
2008 Beln Vela
PL/SQL-12
Disparadores en ORACLE
Disparadores en ORACLE
Ejemplo: A NIVEL DE FILA (ROW TRIGGER) Cuando Cuandose seborre borreen enla latabla tablaPersona Personaalguna algunapersona personaque que se sellame llamepepe pepeo ocuya cuyaedad edadsea seamayor mayorde de35 35aos, aos, eliminar eliminartambin tambindicha dichapersona personade dela latabla tablaPersona2. Persona2.
Persona2 Cod
C1 C2 C3 C4 C5
Nombre Edad
Mara Pepe Pepe Luisa Pepe 25 40 45 48 22
DELETE DELETE FROM FROM Persona Persona WHERE cod in WHERE cod in (C1,C3,C4) (C1,C3,C4)
Borra C3 y C4 de Persona2
PL/SQL-14
Disparadores en ORACLE
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 Cod WHERE Cod=:old.Cod; END Disparador; NEW NULL /
Nombre
NULL
Edad
NULL
OLD
PL/SQL-15
Disparadores en ORACLE Triggers DML Disparados por sentencias DML (de varios tipos): INSERT or UPDATE or DELETE Todas las filas o slo algunas (WHEN)
LIBROS ESTADSTICAS
TOTAL_LIBROS 50 15
CREATE OR REPLACE TRIGGER UpdateEstadisticasGenero AFTER INSERT OR DELETE OR UPDATE ON Libros DECLARE BEGIN CASE UPDATE Estadisticas SET ---------------------END UpdateEstadisticasGenero;
2008 Beln Vela
PL/SQL-16
PL/SQL-17
DEPARTAMENTO
NOMBRE Contabilidad - 1 Recursos Humanos CDIGO CT-1 RRHH
CREATE VIEW EmpleadoDpto as SELECT E.DNI, D.Nombre FROM Empleado E, Departamento D WHERE E.Departamento = D.Cdigo; CREATE OR REPLACE TRIGGER InsertEmpleadoDpto INSTEAD OF INSERT ON EmpleadoDpto DECLARE V_Cod Departamento.Cdigo%TYPE; BEGIN SELECT Cdigo 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 /
INSERT INTO EmpleadoDpto VALUES (11111111', Contabilidad-1); ERROR en lnea 1: ORA-01779: no se puede modificar una columna que se corresponde con una tabla no reservada por clave
2008 Beln Vela
PL/SQL-19
PL/SQL-20
PL/SQL-21
Disparadores en ORACLE 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 estn Activados al crearse)
Un disparador especfico:
ALTER TRIGGER nombre_disparador ENABLE; ALTER TRIGGER nombre_disparador DISABLE;
Borrar un Disparador
DROP TRIGGER nombre_disparador;
PL/SQL-22
PL/SQL-23
SELECT Trigger_type, Triggering_event, Table_name FROM USER_TRIGGERS WHERE Trigger_name = 'REORDER'; TYPE ---------------AFTER EACH ROW TRIGGERING_STATEMENT -------------------------UPDATE TABLE_NAME -----------INVENTORY
PL/SQL-24
PL/SQL-25
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.
PL/SQL-26
NUMBER;
v_nombre VARCHAR2(30);
PL/SQL-27
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
Disparadores en ORACLE 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)
PL/SQL-29
PL/SQL-30
END;
PL/SQL-31
PL/SQL-32
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
Disparadores en ORACLE Tablas Mutantes: solucin cuando hay ms de una fila afectada por la instruccin
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;
2008 Beln Vela
PL/SQL-34
PL/SQL-35
Bibliografa
Bibliografa Bsica
Abbey, 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 Complementaria
Elmasri, R. y Navathe, S. B. Fundamentos de Sistemas de Bases de Datos. Tercera Edicin. Addison-Wesley Iberoamericana, 2000.
PL/SQL-37
PL/SQL-38