Sie sind auf Seite 1von 17

DISPARADORES DE B.D.

Inicio

TRIGGER DE
BASES DE DATOS.

DISPARADORES DE B.D.

Concepto y utilizacin.

Es un bloque PL/SQL almacenado en la B.D. y asociados a


una tabla.
Se pueden utilizar para:
Mantener campos calculados o derivados.
Implementar restricciones complejas de seguridad.
Forzar el cumplimiento de reglas de negocio.
Realizar auditorias basadas en valores.
Realizar cambios implcitos a una accin.

DISPARADORES DE B.D.

Sintaxis

CREATE [OR REPLACE] TRIGGER Nombre_del_trigger


{BEFORE|AFTER DELETE|INSERT|UPDATE [OF lista columnas]}
[OR BEFORE|AFTER} {DELETE|INSERT|UPDATE [OF lista columnas]

ON Nombre_tabla
[REFERENCING NEW AS nombre_nuevo OLD AS nombre_viejo]

FOR EACH {STATEMENT | ROW [WHEN (condicin)] }


-- bloque pl/sql
DECLARE
-- Declaraciones
BEGIN
-- Cuerpo del bloque: Instrucciones
[EXCEPTION
-- Tratamiento de excepciones]
END;

DISPARADORES DE B.D.

Explicacin

Nombre del trigger.


Eventos de disparo: El trigger se disparar cuando se ejecute una
orden DML-SQL : INSERT, DELETE o UPDATE.
NOTA 1: En esta ltima orden, se podrn especificar las columnas cuya
modificacin producirn el disparo.
NOTA 2: Se pueden especificar varios eventos para un mismo trigger
utilizando la clusula OR.

El momento en que se dispara puede ser antes (BEFORE) o


despus (AFTER) de la ejecucin de la orden DML-SQL.

DISPARADORES DE B.D.

Explicacin (continacin... )

El nivel de disparo del trigger puede ser:


A nivel de orden. El trigger se activar una sola vez para la orden
DML-SQL (FOR EACH STATEMENT).
A nivel de fila. El trigger se activar una vez por cada fila afectada
por la orden (FOR EACH ROW).

Restriccin del trigger. La clausula WHEN seguida de una


condicin restringe el disparo del trigger, para que se dispare el trigger
la condicin debe evaluarse TRUE.

Cuerpo del trigger. Se indica el cdigo que se ejecutar cuando se


dispare el trigger.

Resumen

DISPARADORES DE B.D.

Se disparan o ejecutan automticamente cuando se producen


ciertos eventos que afectan a las tablas.
Insercin. // Borrado. // Modificacin.
Before // After
Sentencia / Fila

(3)
(2)
(2)

En resumen, se pueden dar 3 x 2 x 2 = 12 pobilidades, es


decir, existen 12 eventos o sucesos diferentes.
NOTA IMPORTANTE: Disparadores en cascada: la accin
de un disparador puede causar que se dispare otro.

DISPARADORES DE B.D.

:NEW y :OLD

VALORES :NEW y :OLD


Hace referencia a los valores anterior y posterior a una actualizacin
a nivel de fila.
Cuando el evento se produce por DELETE
:OLD.nombreCcolumna
Cuando el evento se produce por INSERT
:NEW.nombreColumna
Cuando el evento se produce por UPDATE
:OLD.nombreColumna y :NEW.nombre_columna
NOTA:
REFERENCING NEW AS nuevo OLD AS viejo .

DISPARADORES DE B.D.

Ejemplo 1

CREATE OR REPLACE TRIGGERS auditarBorradoEmpleados


BEFORE DELETE
ON Empleados
FOR EACH ROW
BEGIN
Insert INTO auditarEmpleados
VALUES (BORRADO || :OLD.NumEmple,||OLD:Apellidos)
END;

DISPARADORES DE B.D.

Ejemplo 2

CREATE OR REPLACE TRIGGER Comprobar_incremento


BEFORE UPDATE OF sal
ON Scott.Empleados
FOR EACH ROW
BEGIN
IF :NEW.sal < :OLD.sal OR :NEW.sal > 1.1*:OLD.sal THEN
RAISE_APPLICATION_ERROR (-20001, ERROR: El salario no
puede reducirse, ni puede aumentarse mas de un 10 por ciento);
END IF;
END;
CREATE OR REPLACE TRIGGERS Comprobar_incremento
BEFORE UPDATE OF sal ON Scott.Empleados FOR EACH ROW
WHEN (IF NEW.sal < :OLD.sal OR NEW.sal > 1.1*:OLD.sal
BEGIN
RAISE_APPLICATION_ERROR (-20001. ERROR: . El salario no puede reducirse, ni puede
aumentarsemas de un 10 por ciento);
END;

DISPARADORES DE B.D.

Predicados condicionales

En ocasiones, en lugar de asociar varios triggers a una misma tabla,


podemos optar por la utilizacin de un solo trigger con mltiplos
eventos de disparo. En este caso se ve la necesidad de utilizar los
siguientes predicados condicionales:
INSERTING
TRUE cuando insertando
DELETING
TRUE cuando borrando
UPDATING
TRUE cuando modificando
UPDATING (nombre_columna)
TRUE cuando modificando la
columna.

EJERCICIO: Disea un disparador que permita llevar un control de las


operaciones de manipulacin de datos sobre la tabla CLIENTES.

DISPARADORES DE B.D.

1.

2.
3.

4.

Se lanza una orden DML-SQL


INSERT / UPDATE / DELETE a
ORACLE.
Se ejecuta el disparador BEFORE
a nivel de sentencia.
Por cada fila devuelta por la
sentencia DML_SQL
a. Se ejecuta el disparador
BEFORE a nivel de fila
b. Se ejecuta la sentencia
DML_SQL y se comprueban
las restricciones definidas.
c. Se ejecuta el disparador
AFTER a nivel de fila.
Ejecucin del disparador AFTER
a nivel de sentencia

Secuencia de ejecucin.

DISPARADORES DE B.D.

Fallo del Trigger.

SI EL DISPARADOR o TRIGGER FALLA:


A nivel de sentencia en el momento BEFORE (2):
No se llega a ejecutar la orden DML_SQL
A nivel de fila (3):
Oracle dar por fallida la actualizacin completa. Oracle har
ROLLBACK de toda la actualizacin.
A nivel de sentencia en el memento AFTER (4):
Ya se ejecuto la sentencia pero se hace ROLLBACK.

DISPARADORES DE B.D.

Trigger de sustitucin

Se pueden crear triggers que no se ejecutan ni antes ni despus, sino en


lugar de (INSTEAD OF) la orden DML-SQL

CREATE [OR REPLACE] TRIGGER Nombre_del_trigger


INSTEAD OF {DELETE|INSERT|UPDATE [OF lista columnas]}
[OR BEFORE|AFTER} {DELETE|INSERT|UPDATE [OF lista columnas]

ON Nombre_vista -- Solo para vistas


FOR EACH ROW Solo acta a nivel de filas.
-- bloque pl/sql
DECLARE
-- Declaraciones
BEGIN
-- Cuerpo del bloque: Instrucciones
[EXCEPTION
-- Tratamiento de excepciones]
END;

DISPARADORES DE B.D.

DDL_SQL y vistas

CREATE TRIGGER nombreTrigger ........


ALTER TRIGGER nombreTrigger DISABLE|ANABLE;
ALTER TRIGGER nombreTrigger COMPILE;
DROP TRIGGER nombreTrigger;

User_triggers
Dba_triggers

DISPARADORES DE B.D.

Consideraciones

Hay que tener el privilegio CREATE TRIGGER


o bien CREATE ANY TRIGGER.
Son una herramienta muy til para controlar muchas situaciones, pero su
uso indiscriminado puede degradar el comportamiento de la base de
datos.
Su comportamiento puede crearnos confusiones, pues se ejecutan
asociados a las rdenes DML_SQL
UTILIZACIN del procedimiento RAISE_APLICATION_ERROR:
Sirve para levantar errores.
RAISE_APLICATION_ERROR (Nmero_error, mensaje_error);
Numero_error debe estar comprendido entre 20000 y 20999
Mensaje_error es una cadena de hasta 512 bytes.

EJEMPLO
CREATE OR REPLACE TRIGGER Control_auditoria_cli
AFTER DELETE OR INSERT OR UPDATE
ON CLIENTES
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
ins number;
del number;
modif number;
BEGIN
select insercion,borrado,modificacion into ins, del, modif from auditoria_cli;
if inserting then
ins:= ins+1;
elsif deleting then
del := del+1;
elsif updating then
modif := modif +1;
end if
update auditoria_cli set insercion = ins, borrado = del, modificacion = modif;
END;

Ejemplo
CREATE OR REPLACE TRIGGER LIM-MAYOR-IMPORTE
BEFORE INSERT
ON PEDIDOS
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
DECLARE
limite clientes.lim_credito%type;
precio productos.precio%type;
BEGIN
select lim_credito into limite from clientes
where num_Clie = :new.clie;
Select precio into precio from productos
where id_fab || id_producto = :new.fab || :new.producto;
if limite < :new.cant * precio then
util.mostrar(EL IMPORTE NO ES VALIDO);
raise_application_error (-30503,'NO PERMITIDO insertar);
end if;
EXCEPTION
when no_data_found then
util.mostrar(El cliente o producto no existe);
END;

Das könnte Ihnen auch gefallen