Вы находитесь на странице: 1из 8

7/10/2019

Disparadores (Triggers)

Disparadores (Triggers)
Los triggers son bloques PL/SQL que se ejecutan de manera implícita
cuando se ejecutan operaciones INSERT, DELETE, UPDATE a una
tabla*
Se usan principalmente para establecer reglas complejas de
integridad y labores de auditoría.
¿Por ejemplo?

* También existen triggers que se disparan ante otros eventos y objetos de la BD (LOGON, LOGOFF,
STARTUP, BEFORE DDL, entre otros.)

1
7/10/2019

Un trigger tiene asociado:

◦ Un evento
◦ Un momento
◦ Un tipo

El evento se refiere a la operación que se efectúa sobre la


tabla (INSERT, DELETE o UPDATE).

El momento, se refiere a cuándo se dispara el trigger en


relación con el evento. Sus posibles valores son BEFORE y
AFTER.
El tipo indica el número de veces que el cuerpo del trigger
se ejecuta: por la operación en conjunto (trigger de
operación) o por cada fila procesada (trigger de fila). En
este último caso se debe adicionar la cláusula FOR EACH
ROW

2
7/10/2019

Haciendo las diferentes combinaciones, para una tabla


se pueden crear máximo doce tipos de triggers.

Se pueden tener varios triggers del mismo tipo


asociados con una misma tabla.

Los triggers se ejecutan implícitamente cuando ocurre


el evento.

Los triggers tienen un par de palabras clave:


 OLD : valores de las columnas antes del cambio.
 NEW :valores de las columnas después de que la
sentencia fue procesada.
Las sentencias INSERT únicamente permiten NEW, las sentencias UPDATE
permiten ambos, NEW y OLD, y las sentencias DELETE permiten sólo OLD.

INSERT NEW
UPDATE NEW / OLD
DELETE OLD

3
7/10/2019

Sintaxis esencial de un trigger:

CREATE [OR REPLACE] TRIGGER nombre_trigger


momento evento ON tabla
Para especificar
[FOR EACH ROW triggers de fila
[WHEN condición]]
bloque de PL/SQL
Si el evento es UPDATE, se puede(n) especificar la(s) columna(s) que
dispararán el trigger con la palabra OF (si no se especifican, el trigger se
dispara con cualquier columna de la tabla que sea actualizada)
El bloque comienza con la palabra DECLARE o BEGIN

Modelo

4
7/10/2019

Ejemplo: Realizar un trigger que descuente la cantidad vendida


a la cantidad existente en inventario.
CREATE TRIGGER DCant
AFTER INSERT ON tventas
FOR EACH ROW
UPDATE tarticulo SET Cantidad = Cantidad - NEW.Cant
WHERE CodA = NEW.TArticulo_CodA;

Probemos con:

INSERT into tventas VALUES(1001,555, 10, '2019-01-02');

Realizar un trigger que al ingresar un nuevo proveedor debe


crear un usuario para login .

?
5
7/10/2019

Realizar un trigger que al ingresar un nuevo proveedor debe


crear un usuario para login .

CREATE TRIGGER nuevoU


AFTER INSERT ON tproveedores
FOR EACH ROW
INSERT INTO usuarios
VALUES(NEW.Nit, NEW.Nombre, '123456');

Realizar un trigger que al eliminar un proveedor también


elimine el usuario de login.

?
6
7/10/2019

Realizar un trigger que al eliminar un proveedor también


elimine el usuario de login.

CREATE TRIGGER DelU


AFTER DELETE ON tproveedores
FOR EACH ROW
DELETE FROM usuarios WHERE unom = OLD.Nombre;

Adicionar un campo des a la tabla tventas y realizar un trigger que al evaluar la cantidad de
artículos vendidos asigne descuento del 10 % si se adquieren mas de 10 articulo y 5 % lo
contrario.

?
7
7/10/2019

Adicionar un campo des a la tabla tventas y realizar un trigger que al evaluar la cantidad de
artículos vendidos asigne descuento del 10 % si se adquieren mas de 10 articulo y 5 % lo
contrario.
DELIMITER $$

CREATE OR REPLACE TRIGGER Descontar


BEFORE INSERT ON tventas
FOR EACH ROW
BEGIN
DECLARE valor FLOAT(30);
SELECT tarticulo.Vr_Unitario INTO valor FROM tarticulo
WHERE CodA = NEW.TArticulo_CodA;
IF (NEW.Cant >= 10) THEN
SET NEW.des = 0.1;
ELSE
SET NEW.des = 0.5;
END IF;
END$$

Вам также может понравиться