Está en la página 1de 36

Triggers(Disparadores)

Ing. Alberto Moreno


Objetivos de la sesión
⚫ Definir los triggers.
⚫ Entender las diferentes modalidades.
⚫ Aplicar triggers para resolver
problemas reales.
Temas a Tratar
⚫ Creación de disparadores.
⚫ Componentes de un disparador.
⚫ Disparadores de BD.
Trigger
⚫ Bloque PL/SQL que se ejecuta
automáticamente cuando se realiza un
evento (INSERT, UPDATE, DELETE).
⚫ Almacenado en la BD.
⚫ No puede ser local.
⚫ No acepta parámetros
Utilidad del Trigger

⚫ Restricción de integridad. (consultar si hay


saldo antes de comprar)
⚫ Auditoria de información. (almacenar quién
modificó ciertos registros: sueldo).
⚫ Aviso automático a otros módulos PL/SQL
para que realicen cierta acción. (inactivar al
trabajador, eliminar el permiso a todos los
módulos del sistema)
Resumen
Sintaxis del Trigger
CREATE OR REPLACE TRIGGER nombre
BEFORE INSERT OR UPDATE
ON tabla
FOR EACH ROW WHEN (condición)
DECLARE
....
BEGIN
....
END; INSERT
BEFORE UPDATE OF col1, col2, …, colN
AFTER DELETE
Tipos de Disparadores
⚫ Orden
INSERT, UPDATE, DELETE
⚫ Temporización
BEFORE, AFTER
⚫ Nivel
FOR EACH ROW
Uso de Identificadores de Correlación
:old y :new
⚫ Permiten acceder a los datos de la fila procesada en el
trigger.

ORDEN :old :new


INSERT NULL Valores a
insertar
UPDATE Valores a Valores a
eliminar insertar
DELETE Valores a NULL
eliminar
Ejercicio 1
⚫ Crear 2 tablas temporal y product.
CREATE TABLE temporal
( prodid number(6),
descrip char(30) );

INSERTAR 3
CREATE TABLE producto REGISTROS
( prodid number(6),
descrip char(30));
Ejercicio 1
⚫ Crear un trigger que se dispare una vez
por cada fila insertada.
CREATE OR REPLACE TRIGGER t_for_row
AFTER INSERT
ON temporal
FOR EACH ROW
BEGIN
dbms_output.put_line('mensaje repetido');
END;
Ejercicio 2
⚫ Crear un trigger que se dispare sólo una
vez luego de la inserción.
CREATE OR REPLACE TRIGGER t_una_vez
AFTER INSERT
ON temporal
BEGIN
dbms_output.put_line(‘una sola vez');
END;
Ejercicio 2
⚫ Probar ambos triggers al insertar más de
un registro a la vez en la tabla temporal.

INSERT INTO temporal


SELECT *
FROM producto ;
Ejercicio 3
⚫ Crear una tabla de auditoría para la tabla
product
CREATE TABLE product
( prodid number(6),
descrip char(30));
CREATE TABLE product_audit
( prodid number(6),
descrip char(30),
user_audit varchar2(20) );
⚫ Crear un trigger que almacene los datos
insertados en la tabla product y el nombre
del usuario que realizó la inserción.

CREATE OR REPLACE TRIGGER t_audit_product


AFTER INSERT
ON product
FOR EACH ROW
DECLARE
vusu varchar2(20);
BEGIN
select user into vusu from dual;
INSERT INTO product_audit
VALUES (:new.prodid, :new.descrip, vusu);
END;
Ejercicio 3
⚫ Inserte un registro en la tabla product

INSERT INTO PRODUCT


VALUES (123456, ‘PROBANDO TRIGGER’);

⚫ Compruebe que se insertó el registro en la


tabla product_audit.

SELECT *
FROM product_audit;
Eliminar o Deshabilitar
⚫ Eliminar un trigger
DROP TRIGGER nombre;

⚫ Deshabilitar un trigger
ALTER TRIGGER nombre DISABLE;

⚫ Habilitar un trigger
ALTER TRIGGER nombre ENABLE;
RESUMEN
Ejercicio 4
⚫ Crear una tabla historial para almacenar
las modificaciones a la tabla product.
CREATE TABLE historial
( prodid number(6),
descrip char(30),
fecha date );
Ejercicio 4
⚫ Crear un trigger que almacene el historial
de modificaciones de nombres de
productos.
CREATE OR REPLACE TRIGGER t_product
AFTER UPDATE
ON product
FOR EACH ROW
BEGIN
INSERT INTO historial VALUES
(:old.prodid, :old.descrip, sysdate);
END;
Ejercicio 4
⚫ Actualizar una descripción de la tabla
product.

UPDATE product
SET descrip = ‘NUEVA DESCRIPCIÓN’
WHERE prodid = 5 ;
Ejercicio 4
⚫ Comprobar que haya insertado en la tabla
historial.

SELECT *
FROM historial ;
Cláusula WHEN
⚫ Válida sólo cuando se usa FOR EACH
ROW.
⚫ Se disparará sólo cuando cumpla la
condición.
⚫ Se puede usar las variables old y new
dentro de la condición, pero no se usan
los dos puntos (:)
Ejercicio 5
⚫ Crear un trigger que muestre un mensaje
cuando se inserta un empleado con
salario mayor a 1000.
CREATE OR REPLACE TRIGGER t_emp
AFTER INSERT,DELETE, UPDATE
ON emp
FOR EACH ROW WHEN (new.sal>1000)
BEGIN
dbms_output.put_line(‘Salario superior’);
END;
Ejercicio 5
⚫ Insertar un empleado con salario mayor a
1000.
INSERT INTO emp (empno, sal)
VALUES (9876, 1001);

⚫ Insertar un empleado con salario no


mayor a 1000.

INSERT INTO emp (empno, sal)


VALUES (9877, 1000);
RESUMEN
Predicados en Triggers

PREDICADO COMPORTAMIENTO
INSERTING TRUE si fue un INSERT.
FALSE caso contrario.
UPDATING TRUE si fue un UPDATE.
FALSE caso contrario.
DELETING TRUE si fue un DELETE.
FALSE caso contrario.
Ejercicio 5
⚫ Modificar la tabla historial para aumentar
un campo ORDEN.
⚫ En este campo se almacenará el tipo de
orden DML que genera el registro.

ALTER TABLE historial


ADD orden varchar2(10);
Ejercicio 5
⚫ Modificar el trigger t_product para que
almacene el historial de inserciones y
eliminaciones, además del de
modificaciones de productos.
Ejercicio 5
CREATE OR REPLACE TRIGGER t_product
AFTER INSERT OR UPDATE OR DELETE
ON product
FOR EACH ROW
BEGIN
IF INSERTING THEN
INSERT INTO historial VALUES
(:new.prodid, :new.descrip, sysdate, ‘INSERT’);
ELSIF UPDATING THEN
INSERT INTO historial VALUES
(:old.prodid, :old.descrip, sysdate, ‘UPDATE’);
ELSIF DELETING THEN
INSERT INTO historial VALUES
(:old.prodid, :old.descrip, sysdate, ‘DELETE’);
END IF;
END;
CONSULTAR DATOS TRIGGER
Ejercicios
⚫ Cree un trigger que valide que cualquier
actualización del salario de un empleado,
el monto no debe pasar de 10000 nuevos
soles. En caso se esté actualizando el
salario de un empleado con un monto
mayor, el trigger debe asignar el monto
10000 como tope.
⚫ Cree un trigger que capture información
de los empleados a los cuales se les está
modificando el salario. Solamente para los
de contabilidad (ACCOUNTING).
Ejercicios
⚫ Simule una eliminación en cascada de tal
forma que cuando se elimine
departamento se eliminen los empleados
de dicho departamento eliminado.
⚫ Cree tablas de auditoria(una sola tabla)
para las modificaciones en las tablas emp
y dept deberá almacenar la fecha ,
pc,usuario ,valor antiguoy nuevo(y el
nombre de la tabla en la cual se realizo el
cambio
FIN DE CLASE

MUCHAS GRACIAS
,ALGUNA PREGUNTA?
introducción
PARTES BÁSICAS

También podría gustarte