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

Responder a