Está en la página 1de 26

TRIGGERS DE

BASES DE DATOS
Administracin de Bases de Datos

Ing. Luis Reyes

Triggers

Un trigger es un procedimiento almacenado asociado con una


tabla, el cual se ejecuta automticamente cuando se modifica
un dato de esa tabla.

Un trigger es un mecanismo de la base de datos para ejecutar


automticamente una sentencia SQL cuando ocurre un evento.

Una tabla slo pueden tener trigger de INSERT o DELETE, y mas


de uno de UPDATE mientras que las columnas intervenientes en el
update sean disjuntas (datos no comunes).

Son procedimientos que se ejecutan de manera automtica cuando


una estructura INSERT, UPDATE o DELETE es empleada sobre
una tabla. As mismo pueden estar asociados a eventos que ocurran
sobre la Base de datos
DBDII Ing. Luis Reyes

Cuando usar Triggers


Reglas de consistencia (no provistas
por el modelo relacional)
Replicacin de datos
Auditora
Acciones en cascada
Autorizacin de seguridad

DBDII Ing. Luis Reyes

Para que sirve un Trigger

Son ampliamente empleados en la


personalizacin de la Administracin de la BD
Generacin automtica de valores derivados de
una columna
Prevenir transacciones invalidas
Proporcionar auditorias sofisticadas
Mantener la sincrona en tablas replicadas
Generar estadsticas de acceso
Modificar los valores de una vista

DBDII Ing. Luis Reyes

Ejecucin
La ejecucin se realiza cuando una
tabla a la que esta asociada el trigger
genera un evento, ya sea de insercin,
eliminacin o actualizacin.
Los triggers estn almacenados en
una tabla de catlogo del sistema
como parte de la propiedades de la
tabla
Son optimizados antes de la ejecucin

DBDII Ing. Luis Reyes

Que es un Trigger

DBDII Ing. Luis Reyes

Definicin de reglas de actividad


Define el comportamiento activo
del sistema. Aplicaciones:
comprobacin de restricciones de
integridad
control de la seguridad
definicin de reglas de
funcionamiento de la organizacin
mantenimiento de informacin
derivada
DBDII Ing. Luis Reyes

Forma de una regla de Actividad


Evento - Condicin - Accin
accin que el sistema ejecuta cuando como
respuesta a la ocurrencia de un evento
cuando cierta condicin se satisface.
evento: operacin de actualizacin
condicin: expresin lgica del SQL
accin: procedimiento escrito que incluye
instruccin de manipulacin de la BD)

DBDII Ing. Luis Reyes

Sintaxis
definicin_regla::=
{CREATE | REPLACE} TRIGGER nombre_regla
{BEFORE | AFTER | INSTEAD OF} evento
[disyuncin_eventos]
ON {nombre_relacin | nombre_vista}
[ [REFERENCING OLD AS nombre_referencia
[NEW AS nombre_referencia] ]
[FOR EACH {ROW | STATEMENT} [WHEN ( condicin ) ] ]
bloque SQL
disyuncin_eventos ::= OR evento [disyuncin_eventos]
evento ::=
INSERT | DELETE | UPDATE [OF
comalista_nombre_atributo]
DBDII Ing. Luis Reyes

CREATE TRIGGER <nombre>


{BEFORE|AFTER}
{INSERT|UPDATE|DELETE}
ON <nombretabla>
FOR EACH ROW
BEGIN
<sentencias_SQL>
END;

DBDII Ing. Luis Reyes

Componentes de Create Trigger


Create trigger Nombre
<Evento del trigger> tabla
<Accion del Trigger>
<Nombre correlacionado>

DBDII Ing. Luis Reyes

Eventos del Trigger

Create trigger <nombre> insert on


<nombre_tabla>

Create trigger <nombre> delete on


<nombre_tabla>

Create trigger <nombre> update on


<nombre_tabla>

Create trigger <nombre> update of


<nombre_columna> on <nombre_tabla>
DBDII Ing. Luis Reyes

Acciones del Trigger

before (execute procedure proc1(..))


Ejecutado antes que las filas sean procesadas

for each row (execute procedure


proc1(..))
Ejecutado despus que cada fila sea procesada

after (execute procedure <proc1(..))


Ejecutado despus que todas las filas sean
procesadas
DBDII Ing. Luis Reyes

Forma de Ejecucin
FOR EACH STATEMENT

FOR EACH ROW

BEFORE

La regla se ejecuta una vez antes


de la ejecucin de la operacin
de actualizacin

La regla se ejecuta una vez antes de


actualizacin de cada tupla afectada
por la operacin de actualizacin

AFTER

La regla se ejecuta una vez


despus de la ejecucin de la
operacin de actualizacin

La regla se ejecuta una vez despus


de actualizacin de cada tupla
afectada por la operacin de
actualizacin

DBDII Ing. Luis Reyes

Eventos
BEFORE | AFTER | INSTEAD OF} evento
[disyuncin_eventos]
ON {nombre_relacin | nombre_vista}
disyuncin_eventos ::= OR evento
[disyuncin_eventos]
evento ::=
INSERT | DELETE | UPDATE [OF
comalista_nombre_atributo]

DBDII Ing. Luis Reyes

Eventos
Parametrizacin de eventos:
los eventos de las reglas FOR EACH ROW estn
parametrizados
pametrizacin implcita:
evento INSERT o DELETE: n (n grado de la relacin)
evento UPDATE: 2*n

nombre de parmetros:
evento INSERT: NEW
evento DELETE: OLD
evento UPDATE: OLD y NEW

se pueden usar en la condicin de la regla


se pueden usar en el bloque PL/SQL
DBDII Ing. Luis Reyes

Clausula OLD y NEW

Las Clusulas OLD y NEW nos permiten acceder a las columnas


en los renglones afectados por un Trigger.

OLD y NEW no son sensibles a Maysculas (se pueden escribir en


maysculas o minsculas)

En un trigger INSERT solo se puede utilizar


NEW.nombre_de_columna, no existe OLD.row.

En un trigger DELETE solo se puede utilizar


OLD.nombre_de_columna, no existe NEW.row.

En un trigger UPDATE puede utilizarse OLD.nombre_de_columna


y el NEW.nombre_de_columna, pues representan el dato actual y
el nuevo dato que reemplazar al existen.

En los ejemplos que se mostrarn mas adelantes, se ver el uso de


ellos
DBDII Ing. Luis Reyes

Condiciones
WHEN (condicin)
expresin lgica de sintaxis similar a
la condicin de la clusula WHERE de
la instruccin SELECT
no puede contener subconsultas ni
funciones agregadas
slo se puede hacer referencia a los
parmetros del evento

DBDII Ing. Luis Reyes

Acciones
bloque SQL
bloque escrito en el lenguaje de
programacin de SQL
sentencias de manipulacin de la BD:
INSERT, DELETE, UPDATE,
SELECT ... INTO ...
sentencias de programa:
asignacin, seleccin, iteracin
sentencias de manejo de errores
sentencias de entrada/salida
DBDII Ing. Luis Reyes

Reglas del lenguaje


Creacin: CREATE TRIGGER nombre_regla ...
Eliminacin: DROP TRIGGER nombre_reglas
Modificacin: REPLACE TRIGGER nombre_regla
...
Recompilacin: ALTER TRIGGER nombre_regla
COMPILE
Des/Habilitar regla: ALTER TRIGGER
nombre_regla [ENABLE | DISABLE]
Des/Habilitar todas las reglas sobre una relacin:
ALTER TABLE nombre_relacin [{ENABLE |
DISABLE} ALL TRIGGERS]

DBDII Ing. Luis Reyes

Reglas
a)

La siguiente regla define en el esquema de la base de


datos el siguiente comportamiento activo: despus de
cada insercin en la relacin R hacer una copia de la
tupla insertada en la relacin R_copia.

(El esquema de R es R(A:dom_A, B:dom_B) )


CREATE TRIGGER T1
AFTER INSERT ON R
FOR EACH ROW
BEGIN
INSERT INTO R_copia VALUES(:NEW.A, :NEW.B);
END;

DBDII Ing. Luis Reyes

b)

La siguiente regla define en el esquema de la base de


datos el siguiente comportamiento activo: despus de
cada operacin de actualizacin de la relacin R
registrar la informacin sobre el usuario y la fecha de la
actualizacin en la relacin R_control
CREATE TRIGGER T2
AFTER INSERT OR UPDATE OR DELETE ON R
FOR EACH STATEMENT
BEGIN
INSERT INTO R_control VALUES(user, sysdate);
END;
(user y sysdate son funciones del sistema que devuelven
respectivmente el usuario de la sesin y la fecha del sistema)
DBDII Ing. Luis Reyes

c)

La siguiente regla define en el esquema la


restriccin: No se puede insertar en la relacin R
una tupla si existe en la relacin S
CREATE TRIGGER T3
AFTER INSERT ON R
FOR EACH ROW
DECLARE
Aux NUMBER;
BEGIN
SELECT Count(*) INTO Aux
FROM S WHERE :NEW.A=S.A;
IF Aux>0 THEN RAISE_APPLICATION_ERROR(-20000,
No se puede realizar esta operacin);
END IF;
END;

DBDII Ing. Luis Reyes

Ejemplo de Auditoria
DROP TRIGGER tu_envios ;
CREATE TRIGGER tu_envios UPDATE on envios
referencing old as vieja new as nueva
FOR EACH ROW (
INSERT INTO log_envios (id_congreso,
id_trabajo, fecha, usuario, fecha_act, oper)
VALUES (nueva. id_congreso, nueva.id_trabajo,
nueva.fecha, User, today, 'U');
);

Cuando se modifique algn dato en la tabla envos,


entonces se agregar un registro en la tabla log_envios
DBDII Ing. Luis Reyes

Ejemplo
CREATE TRIGGER upd_check_sueldo BEFORE UPDATE ON empleado
FOR EACH ROW
BEGIN
IF NEW.sueldo < 100 THEN
SET NEW.sueldo = 100;
ELSEIF NEW.sueldo > 10000 THEN
SET NEW.sueldo = 10000;
END IF;
IF NEW.sueldo < OLD.sueldo THEN
SET NEW.sueldo = OLD.sueldo;
END IF;
END//
En este ejemplo, si los nuevos sueldos son menores a 100 o mayores a
10,000, se dejara el valor original
Si el nuevo sueldo es menor que el que ya existe, se deja el original, pues a
nadie se le puede bajar el suelo.

DBDII Ing. Luis Reyes

Errores durante la ejecucin

Si un BEFORE Trigger falla, la operacin correspondiente al rengln


no se ejecuta

Un AFTER trigger es ejecutado solo si un BEFORE trigger es


ejecutado con xito y la operacin correspondiente al rengln es
exitosa.

Un error en un BEFORE o AFTER trigger provoca un error en la


sentencia que causo la invocacin del trigger

Para tablas transaccionales, el fallo de un trigger provoca el rollback


de todos los cambios ejecutados por la sentencia.

DBDII Ing. Luis Reyes