Escolar Documentos
Profissional Documentos
Cultura Documentos
Introduccin
Restricciones (Constraints)
CREATE PROCEDURE Get_emp_rec
(Emp_number IN
Emp_tab.Empno%TYPE) AS
Auditoras BEGIN
Informar de eventos
- - - - -
END;
/ PROCEDIMIENTO
2
2
Introduccin
3 Tipos
DML/DDL (Fila/Sentencia, BEFORE/AFTER)
INSTEAD OF
SYSTEM
3
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>
[DECLARE]
BEGIN
cuerpo del trigger
[EXCEPTION] Accin
END;
/
4
4
Estructura General de un Disparador. Ejemplo
DECLARE
x NUMBER; Accin
BEGIN
-- Nmero de pedidos pendientes de ese producto
SELECT COUNT(*) INTO x FROM PedidosPendientes
WHERE num_producto=:num_producto;
-- Si no hay ninguna orden, hacer el pedido
IF x = 0 THEN
INSERT INTO PedidosPendientes
VALUES (:new.num_producto, :new.cantidad_pedido, SYSDATE);
END IF;
END;
5
5
Temporalidad del Evento: AFTER / BEFORE
BEFORE
Ejecutan la accin asociada ANTES de que la
sentencia sea ejecutada
Decidir si la accin debe realizarse
Utilizar valores alternativos para la sentencia
CREATE TRIGGER NombreTrigger
BEFORE Insert ON NombreTabla .
AFTER
Ejecutan la accin asociada DESPUS de que se
haya ejecutado la sentencia
CREATE TRIGGER NombreTrigger
AFTER Insert ON NombreTabla .
6
6
Granularidad del Evento:
FOR EACH ROW / STATEMENT
A NIVEL DE FILA:
ROW TRIGGERS
7
7
Granularidad del Evento:
FOR EACH ROW / STATEMENT
A NIVEL DE SENTENCIA:
STATEMENT TRIGGERS
8
8
ROW TRIGGER: ejemplo
A NIVEL DE FILA
Cuando se borre en la tabla Persona alguna persona que
se llame pepe o cuya edad sea mayor de 35 aos,
eliminar tambin dicha persona de la tabla Persona2
Persona Persona2
Cod Nombre Edad Cod Nombre Edad
C1 Mara 25 C1 Mara 25
C2 Pepe 40 C2 Pepe 40
C3 Pepe 45 C3 Pepe 45
C4 Luisa 48 C4 Luisa 48
C5 Pepe 22 C5 Pepe 22
Socio
Cod Nombre Fecha_ant
S1 Mara
S2 Pepe
S3 Pepe
S4 Luisa
S5 Pepe
11
11
Orden de Ejecucin
LIBROS ESTADSTICAS
ISBN GENERO TTULO GENERO TOTAL_LIBROS
100-09-89 Novela El Quijote Novela 50
----- ---- ---- Infantil 15
END UpdateEstadisticasGenero;
/
14
14
Triggers INSTEAD OF
Usuarios
END LogCreations;
/
Login / Logoff
Sentencias DDL: CREATE, ALTER, DROP
16
16
Funciones del Cuerpo del Disparador
17
17
Elevar excepciones en el cuerpo del Disparador
RAISE_APPLICATION_ ERROR
(nro_error, mensaje); [-20000 y -20999]
18
18
Declaracin de Variables
CREATE...
BEFORE...
[FOR EACH ROW ...]
DECLARE
Declaracin de variables
BEGIN
Un disparador especfico:
ALTER TRIGGER nombre_disparador ENABLE
ALTER TRIGGER nombre_disparador DISABLE
Borrar un Disparador
DROP TRIGGER nombre_disparador;
20
20
Consultar informacin sobre los disparadores
21
21
Ejemplo
23
23
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 (-20001,
Datos de profesor incorrectos');
END; 24
24
Tablas Mutantes: ejemplo
UPDATE asignaturas
SET DNI = 000000000
WHERE asignaturas_id = BD;
SELECT COUNT(*)
UPDATE section
INTO v_total
* FROM asignaturas
WHERE DNI = :NEW.DNI;
ERROR at line 1:
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'
25
25
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)
26
26
Tablas Mutantes: solucin
27
27
Tablas Mutantes: Solucin
CREATE OR REPLACE TRIGGER trigger_asignaturas
BEFORE INSERT OR UPDATE ON section
FOR EACH ROW
BEGIN
IF :NEW.DNI IS NOT NULL THEN
BEGIN
pck_profesores.v_DNI_profesor := :NEW.DNI;
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,
'This is not a valid instructor');
END;
END IF;
END;
28
28
Tablas Mutantes: Solucin
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'
30
30