2013/6/24 Alexsander Rosa <[email protected]
<mailto:[email protected]> >

Estou colocando COMMENTS nas constraints com mensagens de erro mais claras.

Quero poder converter isto:

ERROR:  new row for relation "produto" violates check constraint
"chk_produto_precomin"

Nisto:

O preço de tabela do produto não pode estar abaixo do preço mínimo.

 

Gostaria de uma maneira de descobrir o SQLSTATE e o ID da constraint que deu
erro.

Em último caso vou procurar tudo que está entre aspas no catálogo.

 

 

Infelizmente, até o PostgreSQL 9.3 não há um jeito realmente elegante de se
fazer isso. Se você puder esperar um pouco, na versão 9.3 (hoje em beta) é
possível coletar quais foram exatamente os objetos que geraram uma exceção
[1]. Claro que essa funcionalidade também vai depender do driver da sua
linguagem (que você não informou).

Se desconsiderarmos essa funcionalidade, creio que a melhor forma seja aliar
o código da exceção [2] com o a mensagem de erro. Nesse caso, use sempre
mensagens numa determinada língua (preferencialmente inglês, para evitar
problemas) e faça um parser (regex) da mensagem de erro. Pegar só o que está
entre strings me parece uma boa ideia, considerando que não use nomes fora
do comum nos seus objetos não vejo problemas.


[1]
http://www.depesz.com/2013/03/07/waiting-for-9-3-provide-database-object-nam
es-as-separate-fields-in-error-messages/
[2] http://www.postgresql.org/docs/current/static/errcodes-appendix.html

Atenciosamente,

-- 
Matheus de Oliveira



 

Outra opção que pode ser feita em nível de aplicação é colocar alguma
trigger no before insert/update que valide os  eventos e na função vc faz um
exception. Exemplo: 

IF NEW. precomin = 0 THEN
  raise exception ‘%’,’ O preço de tabela do produto não pode estar igual a
0’; 
END IF;

Com isso, será disparado uma exceção na sua aplicação, vc pega, trata a
exceção e coleta apenas a mensagem da mesma. Cuidado, pois uma trigger desse
tipo não substitui uma chave primaria e/ou estrangeira.

Detalhe. Um raise exception gera um rollback de sua transação e isso as
vezes não é conveniente.

Atenciosamente
Rieg.

 

_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a