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 |
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 |