Sunteți pe pagina 1din 7

Creacin de un trigger

Los Triggers son funciones que se ejecutan de forma automtica en respuesta a ciertos eventos que ocurren en la base de datos. Ejecucin de un Trigger: (Cuando se ejecuta un trigger)

Antes o despus de INSERT Antes o despus de UPDATE Antes o despus de DELETE

Al momento de definir un trigger es necesario

Definir la respuesta a evento (INSERT, UPDATE, DELETE) Especificar la tabla de operacin Definir el tipo de evento al que se responder.

Formato en la creacin de un trigger: CREATE OR REPLACE FUNCTION nombrefuncion (par1, par2) RETURNS trigger AS $$ DECLARE Variable; Variable; BEGIN Sentencia; Sentencia; END; $$ Languaje plpgsql

Definicin formal de un trigger: CREATE OR REPLACE TRIGGER nombretrigger [AFTER | BEFORE] [INSERT | UPDATE | DELETE] ON nombretabla FOREACH [ROW | STATEMENT] EXECUTE PROCEDURE function

1. 2. 3. 4. 5. 6.

CREATE TRIGGER nombretrigger : Creacin del trigger [AFTER | BEFORE ] : Antes o despus del evento [INSERT | UPDATE | DELETE ]: El tipo de evento al que se responder ON nombretabla : De que tabla se esperarn los eventos FOR EACH [ROW | STATEMENT ] : Para cada fila o para cada sentencia EXECUTE PROCEDURE funcin : La funcin que se va a ejecutar (con sus parmetros si es que los necesitara)

Variables por defecto en PostgreSql


1. current_user 2. current_date 3. current_time 4. NEW 5. OLD 6. TG_OP 7. TG_ARGV
: el nombre del usuario que esta actualmente conectado a la base de datos y que ejecuta las sentencias. : La fecha actual (del servidor, no del cliente). : La hora actual. : Variable compuesta que almacena los nuevos valores de la tupla q se esta modificando. : Variable compuesta que almacena los valores antiguos de la tupla que se esta modificando. : Variable tipo string que indica que tipo de evento est ocurriendo (INSERT,UPDATE, DELETE). : Variable tipo arreglo que almacena los parmetros de la funcin del trigger, podemos accederlos de la forma TG_ARGV[0], TG_ARGV[1], etc.

Trigger de validacin del Stock de un Producto


Crear un TRIGGER que valide el stock de un producto al realizar una venta de una determinada cantidad de unidades del mismo. Incluir una consulta simple, a modo de ejemplo, para verificar la funcionalidad del TRIGGER. Solucin:
Al momento de vender un producto, necesitamos registrar la venta (INSERT) y seleccionar el producto de la tabla del producto, actualizando (UPDATE) su stock. Vamos a utilizar las siguientes tablas:

1. Tabla: PRODUCTO
CREATE TABLE PRODUCTO ( id SERIAL PRIMARY KEY, tipo VARCHAR(20) NOT NULL, valor INTEGER NOT NULL CHECK(valor > 0), stock INTEGER NOT NULL CHECK(stock >= 0) );

2. Tabla: VENTA_PRODUCTO
CREATE TABLE VENTA_PRODUCTO ( num_boleta SERIAL PRIMARY KEY, fecha DATE NOT NULL, hora TIME NOT NULL, cant_items INTEGER NOT NULL, empleado_rut VARCHAR(10) REFERENCES EMPLEADO(rut), producto_id INTEGER REFERENCES PRODUCTO(id) );

Creacion de la Funcion

Compara Stock del producto en relacin con la cantidad de tems a comprar. Si es menor igual retorna null. Si el stock es mayor o igual primero descuenta la cantidad de tems vendidos del stock. Luego actualiza los datos en la tabla PRODUCTO. Y por ltimo retorna la consulta.

CREATE OR REPLACE FUNCTION validaStock_tri() RETURNS trigger AS $$ DECLARE Result INTEGER; BEGIN IF (TG_OP = INSERT) THEN IF ((SELECT stock FROM PRODUCTO WHERE id = NEW.producto_id) < NEW.cant_items) THEN RETURN NULL; ELSE Result = (SELECT stock FROM PRODUCTO WHERE id = NEW.producto_id) - NEW.cant_items; UPDATE PRODUCTO SET stock = Result WHERE id = NEW.producto_id; RETURN NEW; END IF; END IF; RETURN NULL; END; $$ Language plpgsql;

Creacin del Trigger

CREATE TRIGGER valida_stock BEFORE INSERT ON VENTA_PRODUCTO FOR EACH ROW EXECUTE PROCEDURE validaStock_tri();

Para borrar el trigger: DROP TRIGGER valida_stock ON VENTA_PRODUCTO;

Consultas de prueba
Respesta Satisfactoria. INSERT INTO VENTA_PRODUCTO (num_boleta, fecha, hora, empleado_rut, cant_items, producto_id) VALUES (nextval('venta_producto_num_boleta_seq'),'10-12-2007', '15:45', '17199688', '5', '4'); Respesta Nula. INSERT INTO VENTA_PRODUCTO (num_boleta, fecha, hora, empleado_rut, cant_items, producto_id) VALUES (nextval('venta_producto_num_boleta_seq'),'10-12-2007', '15:45', '17199688', '7000', '1');

Creacin de un ndice
Los ndices nos ayudan a obtener datos de las tablas en forma ms rpida. Generalmente se recomienda crear ndices en tablas. Un ndice puede cubrir una o ms columnas. La sintaxis general para la creacin de un ndice es: CREATE INDEX "NOMBRE_NDICE" ON "NOMBRE_TABLA" (NOMBRE_COLUMNA) No hay una regla estricta respecto de cmo nombrar un ndice. El mtodo generalmente aceptado es colocar un prefijo, tal como IDX_, antes del nombre de un ndice para evitar la confusin con otros objetos de la base de datos.

Creacin de un ndice para la tabla XX en el campo NOMBRE


Crear un ndice a la tabla que usted elija, en el campo que quiera, y con el modo que desee, buscando con esto minimizar el trabajo de las consultas. Argumente bien su eleccin. Solucin:
Elegiremos el campo con la mayor concurrencia para optimizar el costo de recuperacin de dichos atributos. El criterio utilizado es el siguiente: Mas funciones que pelculas Mas ventas de entradas que funciones Ms productos que empleados. Ms ventas de productos que productos (lo ideal).

Por silogismo obtenemos las dos ms concurridas: Venta de Entradas Venta de Productos

De acuerdo al criterio de eliminar a los vendedores que vendan menos de $5000, y que hay ms cantidad de productos, y que estos (los productos) son ms que el numero de empleados, supondremos que se har un esfuerzo en realizar mayor cantidad de ventas en productos.

VENTA-PRODUCTO NUM_BOLETA: SERIAL validar campo auto incremental en la insercin de datos FECHA: DATE HORA: TIME CANT_ITEMS: INTEGER EMPLEADO_RUT: VARCHAR(10)

Para agilizar la recuperacin y la insercin en la tabla de las ventas, crearemos dos ndices, uno para el NUM_BOLETA y otro para el PRODUCTO_ID. Ambos atributos no son jerrquicos, pero son ordenados y para ese motivo le asignaremos la estructura de un Arbol B. CREATE UNIQUE INDEX numBoleta_idx ON VENTA_PRODUCTO (num_boleta); CREATE UNIQUE INDEX productoID_idx ON PRODUCTO (id); Al crear el indice el metodo por defecto es el Arbol B. Para borrar los indices: DROP INDEX [nombre del index]

Eliminar de la Base de datos.


Eliminar de la base de datos a aquellos vendedores que no hayan logrado Vender ms de $5000 tanto en productos como en entradas, ya que provocan Prdidas para el negocio segn lo estimado por la gerencia.
Para eliminar de la base de datos a dichos vendedores crearemos una funcin llamada Elimina_vendedores(); El procedimiento para el vendedor de productos:

Por cada vendedor de productos multiplicar la cantidad de tems vendidos por el valor del producto vendido. Select Sumar todos los valores de dicha operacin. Si el valor da menos que 5000, borrar de la tabla EMPLEADOS al empleado.

El procedimiento para el vendedor de entradas: Por cada vendedor seleccionar sus ventas: Select valor from venta_entrada where rut = therut; Obtener el total del monto de sus ventas: SELECT SUM(valor) FROM venta_entrada where rut=15635154 Si el monto total es menor que $5000, lo eliminamos de la base de datos.

FOR EACH (SELECT rut FROM EMPLEADOS) IF ((SELECT SUM(valor) FROM venta_entrada where empleado_rut=therut) < 5000 ) THEN DELETE FROM EMPLEADO WHERE rut = therut; END IF