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)
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? |