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
