From: | Rodrigo Gonzalez <rjgonzale(at)estrads(dot)com(dot)ar> |
---|---|
To: | Pedro Castro <nahum(dot)listas(at)gmail(dot)com> |
Cc: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: trigers y funciones |
Date: | 2011-08-17 16:40:03 |
Message-ID: | 4E4BEEE3.7030200@estrads.com.ar |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
On 08/17/2011 01:21 PM, Pedro Castro wrote:
> Hola a tod(at)s(dot)
>
> Una aplicación que no diseñe, actualiza los campos de una tabla solo
> copiandolos de un renglon existente y solo se autoincrementa el id que
> es serial con lo que duplica varios datos que no debe hacer, existe la
> posibilidad de cambiar este comportamiento con un trigger y una función.
>
> esta es la tabla.
>
> id | cve1 | cve2 | cve3 | texto
> 1 2 3 4 pepe
> Hay una operación que hace lo siguiente
> update y luego un insert
> id | cve1 | cve2 | cve3 | texto
> 1 2 3 4 pepito ->update
> 2 2 3 4 pepe -> insert
>
> Esto corre en una transacción, lo que necesito que haga con un
> trigger/funcion y me quede:
> id | cve1 | cve2 | cve3 | texto
> 1 2 3 4 pepito ->update
> 2 2 3 5 pepe -> insert
Con una funcion seria algo asi....(sin probar|)
CREATE FUNCTION upsert_table (p_id INT, p_cve1 INT, p_cve2 INT, ....)
RETURNS VOID AS
BEGIN
UPDATE table SET cve1 = p_cve1, cve2 = p_cve2.... WHERE id = p_id;
IF FOUND THEN
RETURN;
END IF;
-- Insert
INSERT INTO table VALUES (p_id, p_cve1.....);
END;
LANGUAGE 'plpgsql';
Modificala de acuerdo a la table que estes usando y podes simplemente
llamarla.
Con un before trigger no estoy seguro que funcionara....pero probalo,
haces un select con NEW.id y haces un update si esta repetido.....eso
si, despues devolve NULL para que no inserte la nueva fila
|
>
> es posible?
>
> Gracias.
>
Saludos
Rodrigo Gonzalez
From | Date | Subject | |
---|---|---|---|
Next Message | caerices | 2011-08-17 18:24:08 | Re: trigers y funciones |
Previous Message | Pedro Castro | 2011-08-17 16:21:33 | trigers y funciones |