Re: sobre transacciones...

From: Gabriel Hermes Colina Zambra <hermeszambra(at)yahoo(dot)com>
To: "Br(at)nsh" <bransh(at)gmail(dot)com>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: sobre transacciones...
Date: 2008-01-15 01:53:26
Message-ID: 245354.34934.qm@web63703.mail.re1.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


--- "Br(at)nsh" <bransh(at)gmail(dot)com> escribió:

> Antes que nada, saludo a toda la comunidad de
> Postgres. Esta es la
> primera vez que escribo en la lista.
>
> Hace poco mas de medio año que estoy utilizando
> postgres version 8 y
> normalmente me recorro la web completa para
> solucionar los problemas que
> se me presentan. Pero en este caso, no encontre
> respuesta y quizas pueda
> deberse a mi falta de imaginacion ;-)
>
> Bueno, paso a explicarme:
> Supongamos tengo 2 tablas:
>
> Provincias (idProvincias, nombre)
> Localidades (idLocalidad, idProvincia, nombre)
>
> Ahora bien, estan relacionadas de manera
> Identificada (es decir, que en
> la tabla Localidades, idProvincia forma parte de la
> clave primaria).
>
> Supongamos ahora que tengo los siguientes registros:
>
> Tabla Provincias:
> idP = 1, nombre = "Cualquiera"
>
> Tabla Localidades:
> idL = 1, idP = 1, nombre = "Uno"
> idL = 2, idP = 1, nombre = "Dos"
>
> Bueno. Tengo una funcion escrita en plpgsql que dado
> un idP borra la
> provincia del id correspondiente, o al menos eso
> intenta siempre que no
> se este por violar una integridad referencial:
> --
> -- Borrar Provincia
> --
> CREATE OR REPLACE FUNCTION
> ssp_borrar_provincia(Provincias.idProvincia%TYPE)
> RETURNS Provincias.idProvincia%TYPE AS $$
> DECLARE
> idP ALIAS FOR $1;
> BEGIN
> --Comprobamos que el idProvincia sea valido
> IF idP IS NULL OR idP = 0 THEN
> RAISE EXCEPTION 'El valor de la columna
> IDPROVINCIA no debe ser
> nulo ni cero.';
> END IF;
>
> DELETE
> FROM Provincias
> WHERE idProvincia = idP;
>
> RETURN idP;
> END;
> $$ LANGUAGE 'plpgsql';
>
> Ahora, mi intencion es hacer una FUNCION que borre
> una cierta localidad
> de la tabla Localidades, y luego intente borrar la
> provincia a la que
> pertence. (se que parece no tener mucho sentido,
> pero lo que necesito
> hacer bajo este concepto si lo tiene, y es demasiado
> largo como para
> exponerlo en una consulta, digamos que se aburririan
> y no querrian
> contestarla, ;-)).
>
> Bueno, la idea seria esto:
>
> CREATE OR REPLACE FUNCTION
> ssp_borrar_localidad(Localidades.idLocalidad%TYPE)
> RETURNS Localidades.idLocalidad%TYPE AS $$
> DECLARE
> idL ALIAS FOR $1;
> idP Localidades.idProvincia%TYPE;
> BEGIN
> --Comprobamos que el idLocalidad sea valido
> IF idL IS NULL OR idL = 0 THEN
> RAISE EXCEPTION 'El valor de la columna
> IDLOCALIDAD no debe ser
> nulo ni cero.';
> END IF;
>
> --Buscamos el idProvincias correspondiente a la
> localidad que se
> desea borrar
> SELECT INTO idP idProvincia
> FROM Localidades
> WHERE idLocalidad = idL;
>
> DELETE
> FROM Localidades
> WHERE idLocalidad = idL;
>
> --Intentamos borrar la provincia
> SELECT ssp_borrar_provincia(idP);
>
> RETURN idL;
> END;
> $$ LANGUAGE 'plpgsql';
>
>
> Ahora el gran problema: Claro esta que lo que quiero
> es que borre la
> localidad y en caso de que se pueda, borre la
> provincia. Peeero, resulta
> que al ocurrir un error de Violacion de Integridad
> Referencial en el
> intento por borrar la provincia al final de la
> funcion, automaticamente
> se hace un ROLLBACK de toda la funcion principal
> (ssp_borrar_localidad)
> y ni siquiera me borra la localidad.
>
> Que solucion me proponen?
>
> Desde ya muchisimas gracias!!
>
> Juan Caillava
>
>
> --
> TIP 1: para suscribirte y desuscribirte, visita
> http://archives.postgresql.org/pgsql-es-ayuda
>
Por que no pones un llave foranea en localidades, que
permita que al borrarse la provincia se borre en
cascada todas las localidades.
Entonces despues creas una funcion que borre la
localidad y si le pasas otro parametro booleano por
ejemplo tambien borre la provincia, con lo que
borraria las otras localidades en cascada, realmente
no se para que queres eso, pero si queres hacer eso
asi, me parece una buena solucion la que te doy, pero
claro yo no haria algo de eso aunque me explicaras
para que, pero eso es harina de otro costal, cuidado
que no se te haga harina los datos.

Atte.
Gabriel Colina

____________________________________________________________________________________
¡Capacidad ilimitada de almacenamiento en tu correo!
No te preocupes más por el espacio de tu cuenta con Correo Yahoo!:
http://correo.espanol.yahoo.com/

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Raúl Andrés Duque 2008-01-15 02:02:04 Re: Error al instalar plperl en windows
Previous Message Alvaro Herrera 2008-01-14 22:58:33 Re: Error al instalar plperl en windows