Está en la página 1de 16

Universidad Ricardo Palma

ESCUELA DE POS GRADO

MAESTRIA EN CIENCIA DE LOS DATOS

MANEJO DE BASE DE DATOS

Mg. WALTER MARTICORENA RAMOS


PL / SQL

Trigger
INTRODUCCIÓN
Un TRIGGER:
◼ Es un bloque PL/SQL o procedimiento PL/SQL
asociado con una tabla, vista, esquema o la base
de datos.
◼ Se ejecuta de manera automática cuando se
produce un evento.
INTRODUCCIÓN
Tipos de TRIGGER:
◼ TRIGGER de Aplicación: Se lanza cuando ocurre
un evento en una aplicación específica.
◼ TRIGGER de Base de Datos: Se lanza cuando
ocurre un evento de datos (como DML) o del
sistema (como el logon o shutdown).
EJEMPLO

Aplicación
INSERT INTO EMPLOYEES
...;
CHECK_SAL verifica los valores
de salario cuando cualquier
aplicación trata de insertar una
fila en la tabla EMPLOYEES

CHECK_SAL trigger
EMPLOYEES table
EMPLOYEE_ID LAST_NAME JOB_ID SALARY
100 King AD_PRES 24000
101 Kochhar AD_VP 17000
102 De Haan AD_VP 17000
103 Hunold IT_PROG 9000
SINTAXIS DE UN TRIGGER
CREATE OR REPLACE TRIGGER nombre
BEFORE|AFTER INSERT|UPDATE|DELETE OF [columna,.] ON tabla
FOR EACH ROW
WHEN condición
DECLARE
Variables, restricciones, cursores y excepciones definidas por el usuario
BEGIN
Bloque_pl/sql;
END;

VARIABLES
:new.columna
:old.columna
EXCEPCIONES
RAISE_APPLICACTION_ERROR()
CREAR UN TRIGGER DML
Una sentencia de TRIGGER contiene:
◼ Tiempo del TRIGGER (TRIGGER Timing)
◆Para tabla: BEFORE, AFTER
◼ Evento del TRIGGER (Triggering Event)
◆INSERT, UPDATE o DELETE.
◼ Nombre de Tabla: ON tabla.
◼ Tipo de TRIGGER: Fila o Sentencia
◼ Cláusula WHEN: Condición de restricción.
◼ Cuerpo del TRIGGER: Bloque PL/SQL.
COMPONENTES DE UN TRIGGER DML
Tiempo del TRIGGER: ¿Cuándo debería lanzarse el
TRIGGER?
◼ BEFORE: Ejecuta el TRIGGER sobre la tabla antes
del evento DML que lanza el TRIGGER.
◼ AFTER: Ejecuta el TRIGGER sobre la tabla
después del evento DML que lanza el TRIGGER.
COMPONENTES DE UN TRIGGER DML
El evento que lanza el TRIGGER puede ser:
◼ INSERT
◼ UPDATE
◼ DELETE
COMPONENTES DE UN TRIGGER DML
Tipo de TRIGGER: ¿Debería ejecutarse para cada fila
afectada por la sentencia DML o sólo una vez?
◼ Sentencia: El cuerpo del TRIGGER se ejecuta una
vez para el evento del TRIGGER. Esto es por
defecto.
◆Un TRIGGER de sentencia se ejecuta una vez,
incluso si no hay filas afectadas.
◼ Fila: El cuerpo del TRIGGER se ejecuta una vez
para cada fila afectada por el evento que lanza el
TRIGGER.
◆Un TRIGGER de fila no se ejecuta si no hay filas
afectadas por el evento.
EJEMPLO DE TRIGGER

CREATE OR REPLACE TRIGGER chequea_edad


BEFORE INSERT OR UPDATE OF edad ON empleado
FOR EACH ROW
DECLARE
v_minedad NUMBER :=20;
v_maxedad NUMBER :=60;
BEGIN
IF (:new.edad > v_maxedad or :new.edad<v_minedad) THEN
raise_application_error (-20225, 'edad fuera de rango');
END IF;
END;
EJEMPLO DE TRIGGER

CREATE OR REPLACE TRIGGER chequea_edad


BEFORE INSERT OR UPDATE OF edad ON empleado
FOR EACH ROW
DECLARE
v_minedad NUMBER :=20;
v_maxedad NUMBER :=60;
BEGIN
IF (:new.edad > v_maxedad) THEN
raise_application_error (-20225, 'edad excede limite');
ELSIF (:new.edad < v_minedad) THEN
raise_application_error (-20325, 'edad menor que minimo');
END IF;
END;
EJEMPLO DE TRIGGER
CREATE OR REPLACE TRIGGER chequea_edad
BEFORE INSERT OR UPDATE OF edad ON empleado
FOR EACH ROW
WHEN (new.trabajo != 'PRESIDENT')
DECLARE
v_minedad NUMBER :=20;
v_maxedad NUMBER :=60;
BEGIN
IF (:new.edad > v_maxedad) THEN
raise_application_error (-20225, 'edad excede limite');
ELSIF (:new.edad < :old.edad) THEN
raise_application_error (-20320, 'variacion negativa');
ELSIF (:new.edad < v_minedad) THEN
raise_application_error (-20325, 'edad menor que minimo');
END IF;
END chequea_edad;
SECUENCIA DE LLAMADA
Use la siguiente secuencia de llamada para un
TRIGGER sobre una tabla, cuando se manipula una
sola fila:
INSERT INTO departments (department_id,
department_name, location_id)
VALUES (400, 'Consulting', 2400);
BEFORE statement trigger
DEPARTMENT_ID DEPARTMENT_NAME LOCATION_ID
10 Administration 1700
20 Marketing 1800
30 Purchasing 1700
… … …
BEFORE ROW trigger
400 Consulting 2400 AFTER ROW trigger
AFTER statement trigger
La sentencia no diferencia
entre trigger de sentencia y
de fila porque se inserta
exactamente una fila.
SECUENCIA DE LLAMADA
Use la siguiente secuencia de llamada para un
TRIGGER sobre una tabla, cuando se manipulan
varias filas:
UPDATE EMPLOYEES
SET salary = salary *1.1
WHERE department_id = 30;
BEFORE statement trigger
EMPLOYEE_ID LAST_NAME DEPARTMENT_ID
BEFORE ROW trigger
114 Raphaely 30
AFTER ROW trigger
115 Khoo 30
….
116 Baida 30
BEFORE ROW trigger
117 Tobias 30 AFTER ROW trigger
118 Himuro 30 ….
119 Colmenares 30
AFTER statement trigger
La sentencia si diferencia entre
trigger de sentencia y de fila
porque puede afectar varias filas.
USO DE PREDICADOS CONDICIONALES

CREATE OR REPLACE TRIGGER secure_emp


BEFORE INSERT OR UPDATE OR DELETE ON employees
BEGIN
IF TO_CHAR(SYSDATE, 'DY') IN ('SAT', 'SUN') OR
TO_CHAR(SYSDATE, 'HH24') NOT BETWEEN '08' AND '18'
THEN
IF DELETING THEN RAISE_APPLICATION_ERROR
(-20501,'You may delete from EMPLOYEES table only during
business hours');
ELSIF INSERTING THEN RAISE_APPLICATION_ERROR
(-20502,'You may insert into EMPLOYEES table only during
business hours');
ELSIF UPDATING THEN RAISE_APPLICATION_ERROR
(-20503,'You may update EMPLOYEES table only during business
hours');
END IF;
END IF;
END;

También podría gustarte