You are on page 1of 11

TRIGGERS EN PL/SQL

MORA PATRICIO

CONCEPTO

Los disparadores (o triggers) sonbloques de cdigo PL/SQLasociados a una tabla y


que se ejecutan automticamente como reaccin a unaoperacin DMLespecfica
(INSERT, UPDATE o DELETE) sobre dicha tabla.
En definitiva, los disparadores son eventos a nivel de tabla que se ejecutan
automticamente cuando se realizan ciertas operaciones sobre la tabla.

CREACIN
Para crear un disparador utilizaremos la siguiente instruccin:
CREATE {OR REPLACE} TRIGGER nombre_disp

[BEFORE|AFTER]

[DELETE|INSERT|UPDATE {OF columnas}] [ OR [DELETE|INSERT|UPDATE {OF columnas}]...]

ON tabla

[FOR EACH ROW [WHEN condicion disparo]]

[DECLARE]

-- Declaracin de variables locales

BEGIN

-- Instrucciones de ejecucin

[EXCEPTION]

-- Instrucciones de excepcin

END;

El uso de OR REPLACE permite sobrescribir un trigger existente. Si se omite, y el trigger


existe, se producir, un error.
En principio, dentro del cuerpo de programa del trigger podemos hacer uso de cualquier
orden de consulta o manipulacin de la BD, y llamadas a funciones o procedimientos
siempre que:
No se utilicencomandos DDL.
No se acceda a las tablas que estn siendo modificadas conDELETE, INSERT o UPDATEen
la misma sesin
No se violen lasreglas de integridad, es decir no se pueden modificar llaves primarias, ni
actualizar llaves externas.
No se utilicen sentencias de control detransacciones(Commit, Rollback o Savepoint)
No se llamen aprocedimientosque trasgredan la restriccin anterior.
No se llame a procedimientos que utilicen sentencias de control de transacciones.

TIPOS DE TRIGGERS

ORDEN DE EJECUCIN DE LOS


TRIGGERS
Una misma tabla puede tener varios triggers asociados. En tal caso es necesario
conocer el orden
en el que se van a ejecutar.
Los disparadores se activan al ejecutarse la sentencia SQL.
Si existe, se ejecuta el disparador de tipo BEFORE (disparador previo) con nivel de
orden.
Para cada fila a la que afecte la orden:

Se ejecuta si existe, el disparador de tipo BEFORE con nivel de fila.

Se ejecuta la propia orden.

Se ejecuta si existe, el disparador de tipo AFTER (disparador posterior) con nivel de fila.

Se ejecuta, si existe, el disparador de tipo AFTER con nivel de orden.

RESTRICCIONES DE LOS TRIGGERS


El cuerpo de un disparador es unbloque PL/SQL. Cualquier orden que sea legal en
un bloque PL/SQL , es legal en el cuerpo de un disparador, con las siguientes
restricciones:
- Un disparador no puede emitir ninguna orden decontrol de transacciones
( COMMIT, ROLLBACK o SAVEPOINT). El disparador se activa como parte de la
ejecucin de la orden que provoc el disparo, y forma parte de la misma
transaccin qu dicha orden. Cuando la orden que provoca la orden es confirmada o
cancelada, se confirma o se cancela tambin el trabajo realizado por el disparador.
- Por las mismas razones, ningnprocedure o funcinllamado por el disparador
puede emitir rdenes de control de transacciones.
- El disparador no puede declararvariablesde tipo LONG.

UTILIZACIN DE :OLD Y :NEW EN LOS


DISPARADORES CON NIVEL DE FILA.
Un disparador con nivel de fila se ejecuta una vez por cada fila procesada por la
orden que provoca el disparo. Dentro del disparador, puede accederse a la fila que
est siendo actualmente
procesada utilizando, para ello, dos pseudo-registros,:oldy:new.
En principio tanto :old como :new son del tipotabla_disparo%ROWTYPE;

LA CLUSULA WHEN
La clusula WHEN slo es vlida para disparadores con nivel de fila. Si est presente, el cuerpo del
disparador slo se ejecutar para las filas que cumplan la condicin especificada en la clusula.
CREATE TRIGGER tr1

BEFORE INSERT OR UPDATE OF salario ON scott.emp

FOR EACH ROW WHEN (NEW.job <> 'PRESIDENT')

BEGIN

/* Cuerpo del disparador */

END;
Esto ltimo es equivalente a:
CREATE TRIGGER tr1

BEFORE INSERT OR UPDATE OF salario ON scott.emp

FOR EACH ROW

BEGIN

IF :NEW.job <> 'PRESIDENT' THEN


<span class="comentario">/* Cuerpo del disparador */</span>
END IF;

END;

Para hacer que un trigger ejecute un ROLLBACK de la transaccin que tiene activa y
teniendo en cuenta que en las sentencias que componen el cuerpo de un trigger no
puede haber este tipo de sentencias (rollback, commit,) hay que ejecutarerror /
excepcionmediante la sentencia raise_application_error cuya sintaxis es:

RAISE_APPLICATION_ERROR(num_error,mensaje);

El num_error es un nmero entero cualquiera, aunque se aconseja que tenga 5 dgitos.


raise_application_error( 20000, No se puede modificar el cliente.);

TABLA MUTANDO

Cuando se realiza un trigger sobre una tabla, dicha tabla se dice que est
enproceso de mutacin, es decir, que se estn realizando cambios sobre ella
y que por tantodentro del trigger no se debe hacer ningn tipo de acceso a
dicha tabla con operaciones DML (SELECT, INSERT, DELETE o UPDATE).
Si queremos conocer los valores del registro de la tabla sobre la que se ha
disparado el trigger, este ltimo debe estar declarado de forma FOR EACH ROW y
acceder a sus valores mediante las pseudocolumnas :NEW y :OLD.

You might also like