Re: cuando se incrementa un campo serial en insert

From: Gilberto Castillo Martínez <gilberto(dot)castillo(at)etecsa(dot)cu>
To: Joac <jgarcil(at)hotmail(dot)com>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: cuando se incrementa un campo serial en insert
Date: 2010-03-16 12:19:19
Message-ID: 1268741959.26087.4.camel@gilbertoc.mtcorp.etecsa.cu
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

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.

Attachment Content-Type Size
unknown_filename text/plain 179 bytes

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Oswaldo Hernández 2010-03-16 12:46:06 Re: cuando se incrementa un campo serial en insert
Previous Message Oswaldo Hernández 2010-03-16 11:54:53 Sobre pg_advisory_locks