El mar, 16-03-2010 a las 11:22 +0000, Joac escribió:
> 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.

Se me ocurre que cuando dispare el error, actualices a campo serial al
valor actual - 1. Oh quizás debas llamar a tu función dentro de una
transacción explicita

WORK
.....
....
COMMIT WORK
END

Prueba y nos comentas el resultado.

> 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"();
> 
> 
> 
> ______________________________________________________________________
> ¿Quieres saber qué móvil eres? ¡Descúbrelo aquí!
> --- 
> Este mensaje fue revisado por Kaspersky Mail Gateway en el servidor 
> imx2.etecsa.cu
> Visite nuestros sitios: <http://www.kaspersky.com>, <http://www.viruslist.com>
-- 
Saludos,
Gilberto Castillo
Edificio Beijing. Miramar Trade Center. Etecsa.
Miramar, La Haban.Cuba.
--- 
This message was processed by Kaspersky Mail Gateway 5.6.28/RELEASE running at 
host imx3.etecsa.cu
Visit our web-site: <http://www.kaspersky.com>, <http://www.viruslist.com>
--
TIP 9: visita nuestro canal de IRC #postgresql-es en irc.freenode.net

Responder a