On 08/17/2011 01:21 PM, Pedro Castro wrote:
Hola a tod@s.

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

Responder a