Buenas a todos,
Al utilizar un trigger (disparador) antes de introducir un registro a la tabla
(que tiene como clave primaria un campo serial) se hace una serie de
comprobaciones de otra tabla, si la introducción de datos es correcta se
inserta el registro a la tabla en caso contrario dá un error y no se inserta el
nuevo registro. Pero al dar el error el autoincremento se actualiza como si se
ubiese introducido un registro en la tabla. Lo que me gustaría saber es cuando
se incrementa este campo para cuando dé un error el disparador no se incremente
dicho campo. Aunque en la documentacion indica que cuando se utiliza RAISE
EXCEPTION se aborta la transacción, es cierto no se inserta el registro en la
tabla, pero si que se incrementa el campo serial. Dejo la función disparadora
para mayor compresión.
Saludos,
Joac
CREATE OR REPLACE FUNCTION "restaStock_tri"() RETURNS "trigger" AS '
--*
--* To insert in this point the description of the procedure
--*
DECLARE
conta entrada.entsto%TYPE;
BEGIN
-- Modificar el campo entrada Stock con las salidas que vayan produciendose.
Select entsto into conta from entrada where entpar=new.entpar;
IF conta = 0 THEN
RAISE EXCEPTION ''No se puede registrar la salida ya que no hay stock'';
END IF;
IF new.salcan > conta THEN
RAISE EXCEPTION ''No se puede registrar la salida ya que la cantidad
selecciona es mayor a la que hay en stock'';
ELSE
conta := conta - new.salcan;
update entrada SET entsto = conta where entpar=new.entpar;
END IF;
RETURN NEW;
END;
' LANGUAGE plpgsql;
CREATE TRIGGER "modStock" BEFORE INSERT ON "salida" FOR EACH ROW EXECUTE
PROCEDURE "restaStock_tri"();
_________________________________________________________________
¿Te gustaría tener Hotmail en tu móvil Movistar? ¡Es gratis!
http://serviciosmoviles.es.msn.com/hotmail/movistar-particulares.aspx