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