[pgbr-geral] Como descobrir o nome do ínidice/constraint que causou erro?

2013-06-24 Por tôpico Alexsander Rosa
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.

-- 
Atenciosamente,
Alexsander da Rosa
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Como descobrir o nome do ínidice/constraint que causou erro?

2013-06-24 Por tôpico Juliano Atanazio
Em 24 de junho de 2013 10:39, Alexsander Rosa
alexsander.r...@gmail.comescreveu:

 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.


Você pode tratar isso na sua aplicação através de tratamento de excessões.




 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.

 --
 Atenciosamente,
 Alexsander da Rosa


 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Como descobrir o nome do ínidice/constraint que causou erro?

2013-06-24 Por tôpico Flavio Henrique Araque Gurgel

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.


Você pode tratar isso na sua aplicação através de tratamento de excessões.



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.


Além da dica do Juliano você pode fazer um gatilho (trigger) do tipo 
before e que lança um raise exception caso dê o erro.


[]s

__
Flavio Henrique A. Gurgel
Líder de Projetos Especiais
Consultoria, Projetos  Treinamentos 4LINUX
Tel1: +55-11.2125-4747 ou 2125-4748
www.4linux.com.br
email: fla...@4linux.com.br
__
FREE SOFTWARE SOLUTIONS
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Como descobrir o nome do ínidice/constraint que causou erro?

2013-06-24 Por tôpico Vinicius Santos
 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.


Você sabe o nome da constraint, basta pegar no catálogo o comentário da
mesma.
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Como descobrir o nome do ínidice/constraint que causou erro?

2013-06-24 Por tôpico Alexsander Rosa
Em 24 de junho de 2013 11:09, Flavio Henrique Araque Gurgel 
fla...@4linux.com.br escreveu:

 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.


 Você pode tratar isso na sua aplicação através de tratamento de excessões.

 Além da dica do Juliano você pode fazer um gatilho (trigger) do tipo
 before e que lança um raise exception caso dê o erro.


Agradeço as sugestões, mas quero fazer algo no banco pra poder ser usado
por todas as aplicações.
E acho que colocar um trigger em cada tabela só pra isso me parece
exagerado (e trabalhoso).

-- 
Atenciosamente,
Alexsander da Rosa
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Como descobrir o nome do ínidice/constraint que causou erro?

2013-06-24 Por tôpico Alexsander Rosa
Em 24 de junho de 2013 11:09, Vinicius Santos 
vinicius.santos.li...@gmail.com escreveu:


 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.


 Você sabe o nome da constraint, basta pegar no catálogo o comentário da
 mesma.


Por você sabe o nome da constraint você quer dizer: você pode extrair o
nome da constraint por regex?
Neste caso eu preciso ainda descobrir se a string entre aspas é uma
constraint, um índice, uma tabela, etc.

-- 
Atenciosamente,
Alexsander da Rosa
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Como descobrir o nome do ínidice/constraint que causou erro?

2013-06-24 Por tôpico Juliano Atanazio
Em 24 de junho de 2013 12:00, Alexsander Rosa
alexsander.r...@gmail.comescreveu:

 Em 24 de junho de 2013 11:09, Flavio Henrique Araque Gurgel 
 fla...@4linux.com.br escreveu:

  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.


 Você pode tratar isso na sua aplicação através de tratamento de
 excessões.

 Além da dica do Juliano você pode fazer um gatilho (trigger) do tipo
 before e que lança um raise exception caso dê o erro.


 Agradeço as sugestões, mas quero fazer algo no banco pra poder ser usado
 por todas as aplicações.
 E acho que colocar um trigger em cada tabela só pra isso me parece
 exagerado (e trabalhoso).



De qualquer forma são suas aplicações  que lidam com o banco e quanto menos
o servidor de banco de dados for onerado com processamento que poderia ser
feito fora dele melhor.

Não sei que linguagem vc usa, mas se for Python, por exemplo vc trataria
com esta exceção:

psycopg2.IntegrityError



 --
 Atenciosamente,
 Alexsander da Rosa


 ___
 pgbr-geral mailing list
 pgbr-geral@listas.postgresql.org.br
 https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Como descobrir o nome do ínidice/constraint que causou erro?

2013-06-24 Por tôpico Matheus de Oliveira
2013/6/24 Alexsander Rosa alexsander.r...@gmail.com

 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-names-as-separate-fields-in-error-messages/
[2] http://www.postgresql.org/docs/current/static/errcodes-appendix.html

Atenciosamente,
-- 
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral


Re: [pgbr-geral] Como descobrir o nome do ínidice/constraint que causou erro?

2013-06-24 Por tôpico Leonardo Cezar
2013/6/24 Alexsander Rosa alexsander.r...@gmail.com

 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.


Seria isto??

CREATE  table foo(id int primary key);
CREATE  TABLE bar(id int references foo(id));
COMMENT ON CONSTRAINT bar_id_fkey ON TABLE bar IS 'Falha na chave
estrangeira';

DO $$
BEGIN
  INSERT INTO bar VALUES(2);
  EXCEPTION
WHEN integrity_constraint_violation THEN
  RAISE NOTICE '%', obj_description(49354);
  -- Claro que num trigger vc poderia colocar TG_RELNAME e TG_RELID nos
parametros
  -- desta função
END $$;

Abraço!

-Leo
-- 
Leonardo Cezar
http://www.postgreslogia http://postgreslogia.wordpress.com.com
___
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral