Está en la página 1de 6

SERVICIO NACIONAL DE APRENDIZAJE

ANÁLSIS Y DESARROLLO DE SISTEMAS DE INFORMACIÓN

FICHA363545

Ciudad: Tunja

PROYECTO FORMATIVO
376867 - CONSTRUCCION DE SOFTWARE PARA EL
APOYO DEL SECTOR EMPRESARIAL Y COMERCIAL EN
BOYACA

Instructor: Nidia Zoraida Nieto Hernández


Ingeniera de sistemas
Especialista en base de datos
e-mail: nznietoh@misena.edu.co
Fase: Implementación y
despliegue de la solución

TEMA: Trigger o
disparadores

18/11/2013
Contenido
TRIGGER O DISPARADOR................................................................................................................ 5
TRIGGER O DISPARADOR

Concepto:

- Es un bloque de código PL/SQL asociado a una tabla, vista, esquema o base de datos.
- Se ejecuta de manera autónoma o automática, cuando sucede un evento específico DML,
como INSERT, DELETE y UPDATE que haya definido dentro del código PL/SQL del trigger.

Los trigger se pueden clasificar como:

• Trigger de aplicación, se dispara cuando sucede un evento de una aplicación particular.


• Trigger de base de datos, se dispara cuando sucede un evento de manipulación de datos
DML o evento del sistema como por ejemplo: logon, shutdown sobre la base de datos.

¿Por qué se usan los disparadores?

Para aplicar reglas del negocio complejas o para auditar cambios en los datos.

¿Cuándo usar un trigger?

Es apropiado usar un trigger en los siguientes casos:

• Cuando se quiere garantizar que se ejecuten operaciones específicas, relacionadas con


algún tipo de acción o evento de la base de datos.
• Centralizar operaciones globales.
• Cuando existe algún bloque de código PL/SQL muy largo, es aconsejable segmentarlos en
funciones y procedimientos, para ser llamados desde un trigger.

Tipos de disparadores

• Un tipo de disparador se define mediante el tipo de transacción de disparo y el nivel con el


que se ejecuta el disparador.
• Se tienen los siguientes tipos de disparadores:
◦ Disparadores de nivel de fila - FOR EACH ROW
◦ Disparadores de nivel de instrucción – Sin FOR EACH ROW
◦ Disparadores BEFORE Y AFTER - antes y después de ocurrir un suceso (INSERT,
UPDATE, DELETE).
◦ Disparadores INSTEAD OF
◦ Disparadores de esquema
◦ Disparadores en el nivel de base de datos.

Valores antiguos y nuevos

- Dentro del disparador se puede hacer referencia a los valores antiguos o nuevos
implicados en las instrucciones DML.
- Los valores antiguos (old) hacen referencia a los datos tal y como eran antes de la
instrucción DML; normalmente las instrucciones update y delete hacen referencia a los
valores antiguos.
- Los valores nuevos (new) son los valores de datos que la instrucción DML crea, como en
caso de las columnas de un registro insertado.

Disparador a nivel de instrucción:

Sintaxis:

CREATE OR REPLACE TRIGGER NombreTrigger


BEFORE DELETE/UPDATE/INSERT ON NombreTabla
BEGIN
RAISE_APPLICATION_ERROR (num => -20000, msg => 'Mensaje …');
END;

Ejemplo:

CREATE OR REPLACE TRIGGER ActualizarNomina


BEFORE UPDATE ON Nomina
BEGIN
RAISE_APPLICATION_ERROR (num => -20000, msg => 'No se puede eliminar los datos');
END;
Disparador a nivel de fila:

Sintaxis:

CREATE OR REPLACE TRIGGER NombreTrigger


BEFORE DELETE/UPDATE/INSERT ON NombreTabla
FOR EACH ROW
WHEN (condición)
BEGIN
UPDATE/DELETE/INSERT … ;
END;

Ejemplos:

1. Antes de insertar o crear un departamento debe evaluar que si el número de habitantes es


superior a cero, se debe actualizar inmediatamente el número de habitantes del país al
cual corresponde el nuevo departamento.

CREATE OR REPLACE TRIGGER CREAR_DEPTO


BEFORE INSERT ON DEPARTAMENTO
FOR EACH ROW
WHEN (new.num_hab > 0)
BEGIN
UPDATE pais
SET num_hab= :new.num_hab + num_hab
WHERE id=:new.id_pais;
END;

2. Permitir crear los departamentos solo en caso que el número de habitantes supere los 500
habitantes de lo contrario genera un error.

CREATE OR REPLACE TRIGGER CrearDeptoLimiteHabitantes


BEFORE INSERT ON DEPARTAMENTO
FOR EACH ROW
WHEN (new.num_hab <= 500)
BEGIN
RAISE_APPLICATION_ERROR (num => -20000, msg => 'No se puede crear el
departamento');
END;
NOTA: El valor del num corresponde a una tabla de códigos de errores de ORACLE (ORA), la cual se
puede verificar en la siguiente dirección web o URL:

http://ora-code.com/code-40.html

EJERCICIOS: Estos ejercicios se deben hacer sobre el esquema HR de Oracle database.


1. Crear un trigger que evite insertar o actualizar el salario de un empleado de determinado cargo
con un valor distinto al salario mínimo legal vigente.

CREATE OR REPLACE TRIGGER Tr_SalarioMinimo


BEFORE INSERT or UPDATE OF salary
ON employees
FOR EACH ROW
BEGIN
IF (:NEW.job_id='AD_PRES' AND :NEW.salary<>589000) THEN
RAISE_APPLICATION_ERROR(-20202,'El empleado debe ganar el SMMLV para el
cargo asignado');
END IF;
END;
/

Probar el trigger anterior.

2. Crear un trigger que evite actualizar el salario de un empleado con un valor inferior al salario
mínimo legal vigente.
3. Crear un trigger que evite actualizar el salario de un empleado a un valor inferior al valor que ya
tiene en la base de datos.
4. Crear un trigger para que actualice el código del departamento de un empleado en la tabla
JOB_HISTORY cuando se actualice el código del departamento al empleado desde la tabla
EMPLOYEES.
5. Crear un trigger para que actualice el código del trabajo de un empleado en la tabla
JOB_HISTORY cuando se actualice el código del trabajo al empleado desde la tabla EMPLOYEES.

También podría gustarte