Documente Academic
Documente Profesional
Documente Cultură
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)
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)
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;
CREATE TRIGGER valida_stock BEFORE INSERT ON VENTA_PRODUCTO FOR EACH ROW EXECUTE PROCEDURE validaStock_tri();
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.
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]
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