Re: nombre quien mando la exception?

From: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>
To: "Miguel Beltran R(dot)" <yourpadre(at)gmail(dot)com>
Cc: Ayuda <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Re: nombre quien mando la exception?
Date: 2009-05-19 13:18:34
Message-ID: 20090519131834.GC6471@alvh.no-ip.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Miguel Beltran R. escribió:
> Hola lista
>
> ¿Existe alguna forma de saber el nombre un conStraint que genero una
> excepción?
> Ejemplo, si tengo
>
> ck_material_usado CHECK (usado <= recibido)
> ck_material_reservado CHECK (reservado <= monto);
>
> Y hago un update a esa tabla donde alguna (cualquiera) de las retricciones
> va a levantar una excepción que yo atrapo con su clausula EXCEPTION WHEN
> check_violation THEN, pero como puedo saber con cual se la lanzo la
> excepción para yo poder regresar un mensaje de error mas especifico. "No
> hay dinero suficiente en la cuenta" o "La cuenta no puede recibir mas dinero
> que el establecido originalmente".

La única posibilidad que tienes es revisar el mensaje de error :-( Lo
malo de esa solución es que si se cambia el lenguaje en el que se lanzan
los mensajes, el procesamiento es imposible. Por ej:

alvherre=# set lc_messages to 'C';
SET
alvherre=# insert into ff values (1, 4);
ERROR: new row for relation "ff" violates check constraint "ff_a_check"

alvherre=# set lc_messages to 'es_CL';
SET
alvherre=# insert into ff values (1, 4);
ERROR: el nuevo registro para la relación «ff» viola la restricción check «ff_a_check»

alvherre=# set lc_messages to 'fr_CA';
SET
alvherre=# insert into ff values (1, 4);
ERREUR: la nouvelle ligne viole la contrainte de vérification « ff » de la relation « ff_a_check »

En los tres casos de arriba el nombre de la restricción va al final,
pero no necesariamente tiene que ser así.

Para hacer peores las cosas, el parámetro lc_messages sólo puede ser
cambiado por un superusuario.

...

Esta es una de las cosas que deberíamos mejorar en Postgres. El mensaje
de error ya está separado en varios campos ("message", "hint", "detail",
"context", "file", "line", "position" etc) ... pero faltan algunos
campos con esta información: el nombre de la tabla involucrada, el
nombre de la restricción, el nombre del índice, etc. No debería ser
difícil modificar Postgres para que la entregue, pero alguien tendría
que financiarlo ...

--
Alvaro Herrera http://planet.postgresql.org/
"Tiene valor aquel que admite que es un cobarde" (Fernandel)

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2009-05-19 13:24:09 Re: Implementar Servidor en WinXP?
Previous Message Cesar Erices 2009-05-19 13:14:57 Re: Implementar Servidor en WinXP?