Re: Problema con actulizaciones entre base de datos trabajo y base de datos de mantenimiento. (SOLUCIONADO)

From: Pablo Díaz <inspdr00(at)yahoo(dot)es>
To: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: Problema con actulizaciones entre base de datos trabajo y base de datos de mantenimiento. (SOLUCIONADO)
Date: 2010-02-17 19:13:40
Message-ID: 1266434020.4443.26.camel@janojano.laborate
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Me respondo a mi mismo, por si a alguien le sirve de ayuda.
En la base de datos de producción se define un trigger por cada tabla
que se quiera actualizar de la forma:

CREATE OR REPLACE FUNCTION actualiza_prueba() RETURNS TRIGGER AS
$actualiza$
BEGIN
IF NEW.id IN (SELECT id FROM prueba) THEN
UPDATE prueba SET nombre = NEW.nombre WHERE id = NEW.id;
RETURN NULL;
END IF;
RETURN NEW;
END;

$actualiza$ LANGUAGE plpgsql;

CREATE TRIGGER actualiza_prueba BEFORE INSERT ON prueba FOR EACH ROW
EXECUTE PROCEDURE actualiza_prueba();

de esta manera, nos llega con generar (por ejemplo con pgadmin3) scripts
sql de copia de datos con comandos insert. Unha vez que tenemos ese
script creado, sólo tenemos que hacer un resguardo sobre la base de
datos de producción. Que pasa ahora si inserto un elemento que ya está
en la base de datos de producción(es decir actualizar)?, pues la
respuesta es que se actualiza el valor en la base de datos de producción
ya que entra en la función del trigger y ejecuta el código que está
dentro del if, luego devuelve null que quiere decir que no va a ejecutar
el comando insert inicial.
Y que pasa si no está en la base de datos?, pues que en el trigger no
entra en el if, con lo cal devuelve la fila que se quiere insertar
(return new) y se ejecuta el comando de inserción de forma normal.
Fácil, no?

Saludos!!

El mié, 17-02-2010 a las 17:00 +0100, Pablo Díaz escribió:
> Hola a todos,
>
> Mi problema es el siguiente. Tengo una bd de trabajo y otra de
> producción y necesitaba volcar datos (cuando estos sean definitivos) de
> unha base de datos a otra.
> Pensaba hacerlo con pgdump y pgrestore, pero me parece inviable porque
> la bd de trabajo va a tener los mismos registros que la de producción
> pero actualizados y además contendrá datos nuevos.
>
> ¿Como puedo hacer para volcar datos de una base de datos a otra de forma
> eficiente sin tener que borrar previamente el contenido de la de
> producción?
>
> Se me ocurrió hacerlo con triggers o rules, pero de momento no tube
> éxito, a alguien se le ocurre la forma de hacerlo?
>
> Saludos y gracias de antemano.
>
> --
> TIP 5: Has ledo nuestro extenso FAQ?
> http://www.postgresql.org/docs/faqs.FAQ.html

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Pablo Díaz 2010-02-17 19:18:10 Re: Problema con actulizaciones entre base de datos trabajo y base de datos de mantenimiento.
Previous Message Jorge Jacques 2010-02-17 17:24:37 Re: Se pueden usar Transacciones desde una funcion?