Triggers Datos

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 16

Apuntes PL-SQL

Triggers de Datos
Triggers
• ¿Qué son?
Bloques de código PL-SQL que se ejecutan
automáticamente cuando se produce un evento.
• Tipos de triggers.
– Aplicación: Asociados a un evento del interfaz de
usuario (clic de un botón, pérdida de foco…). Se usan
en Oracle Developer.
– Datos: Asociados a una modificación de los datos
que hay en las tablas: INSERT, UPDATE o DELETE.
– Sistema: Asociados a un evento del sistema. (Login,
Error del Servidor, Arranque de la BD, etc…).
Creación de triggers de datos
• Momento: BEFORE o AFTER o INSTEAD OF.
• Evento: INSERT ó UPDATE ó DELETE
• Nombre Tabla: On NombreTabla
• Tipo de Disparo: Por fila o por sentencia.
• Condición de disparo: Claúsula WHEN.
(sólo en triggers por fila).
• Cuerpo del trigger: DECLARE
BEGIN
END;
Elementos de un trigger
• Momento: ¿Cuándo se va a disparar?
BEFORE: Antes de la instrucción DML, indicado
si el trigger sirve para comprobar si la operación
DML debe hacerse o no.
AFTER: Si queremos que la sentencia se
ejecute antes que el trigger y además no se
prevee que el trigger vaya a hacer fallar la
sentencia.
INSTEAD OF: Solo para modificar vistas que no
son actualizables directamente.
Elementos de un trigger
• Evento: ¿Por qué se ejecuta el trigger?

• INSERT
• UPDATE ( de cualquier columna o de
algunas en concreto).
• DELETE
• Combinación de las anteriores.
Elementos de un trigger
• Tipo de Disparo: ¿Cuántas veces se va a
disparar cuando se produce el evento?

– Por sentencia: Se ejecuta una sola vez, incluso


aunque no haya filas afectadas.
Se usan si la acción del trigger no depende de los
valores de los datos afectados por la operación.

– Por fila: Se ejecuta tantas veces como filas se vean


afectadas por la operación. Se usan si la acción del
trigger depende de los datos afectados.
Elementos del trigger
• Cuerpo del trigger: ¿Qué acción va a realizar el trigger?

El cuerpo del trigger es un bloque PL/SQL:

DECLARE
BEGIN
EXCEPTION
END;

Puede contener variables, cursores, excepciones…

Si el trigger es de fila se permite acceder al valor de los datos


afectados por la orden DML empleando :old y :new.
Orden de disparo
• Supongamos cuatro triggers definidos sobre la tabla
emp llamados:
BeforeStatement
BeforeRow
AfterRow
AfterStatement
y una instrucción DML que afecta a tres registros, por
ejemplo:
UPDATE emp
SET sal = sal *2
WHERE deptno=30;
Orden de disparo
BeforeStatement

BeforeRow
7839 KING 1200 30
AfterRow
BeforeRow
7698 BLAKE 2100 30
AfterRow
BeforeRow 7788 SMITH 2300 30
AfterRow

AfterStatement
Uso de predicados condicionales
• Cuando un trigger puede ser disparado por
varias operaciones distintas, hay una forma de
saber dentro del código del trigger cual de ellas
lo disparó, se llaman predicados condicionales y
se usan así:

• IF INSERTING THEN…
• IF UPDATING [(‘nombreColumna’)] THEN…
• IF DELETING THEN…
Ejemplos de Triggers
• Supongamos que queremos hacer un trigger que impida
insertar datos en la tabla emp fuera del horario normal
de oficina.

Veamos que tipo de trigger es:

• Momento: BEFORE, ya que es un trigger cuyo objetivo


es comprobar si la operación debe hacerse o no.

• Tipo de Disparo: Por sentencia, ya que el contenido de


los datos no es relevante.
Ejemplos de triggers
• El código del trigger anterior sería:

CREATE OR REPLACE TRIGGER SeguridadEmp


BEFORE INSERT ON emp
BEGIN
IF (TO_CHAR(sysdate, ‘DY’) IN (‘SAT’, ‘SUN’) OR
TO_CHAR(sysdate,’HH24) NOT BETWEEN ’08’ AND ’15’ THEN
RAISE_APPLICATION_ERROR( -20100, ‘No puedes insertar
registros fuera del horario normal de oficina’);
END IF;
END;
/
• Nota: Cuando un trigger termina con excepciones no tratadas, la
sentencia que lo disparó hace un ROLLBACK automáticamente.
Uso de :old y :new
• Solo para triggers por fila.
• Sirven para referirse al valor anterior y posterior
a una modificación.

• INSERT: solo existe :new


• DELETE: solo existe :old
• UPDATE: existen :old y :new

• Para usarlos en una claúsula WHEN se le quitan


los dos puntos.
Restricciones en el uso de triggers
• No pueden ejecutarse instrucciones DDL.

• No pueden ejecutarse instrucciones de control de


transacciones (COMMIT, ROLLBACK, …)

• Por sentencia: No tiene sentido el uso de :old y :new.

• Por fila: No puedo consultar los datos de la tabla que ha


disparado el trigger, esto es, no puedo hace una
SELECT de esa tabla (problema de tablas mutantes).
Ejemplos de triggers
• Supongamos que queremos hacer un trigger que no permita a un
empleado ganar más de 5000 si no es el presidente (restricción de
integridad de datos compleja).

Veamos que tipo de trigger es:

• Momento: BEFORE, ya que es un trigger cuyo objetivo es


comprobar si la operación debe permitirse o no.

• Tipo de Disparo: Por fila, ya que el contenido de los datos es


necesario.

• Evento: Se disparará cuando haya un INSERT o un UPDATE del


sueldo o un UPDATE del oficio.
Ejemplos de triggers
• El código del trigger anterior sería:

CREATE OR REPLACE TRIGGER ControlSueldo


BEFORE INSERT OR UPDATE ON EMP
FOR EACH ROW

BEGIN

IF :new.sal>5000 AND :new.job!='PRESIDENT' THEN


RAISE_APPLICATION_ERROR(-20100, 'No puede ganar
tanto si no es presidente');
END IF;

END;
/

También podría gustarte