[pgbr-geral] Como descobrir o nome do ínidice/constraint que causou erro?
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?
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?
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?
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?
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?
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?
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/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/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