Re: [pgbr-geral] PostgreSQL 9.1 e 9.3 na mesma maquina, remover 9.1
On 2015-10-20 12:03, Thiago H. Barreto wrote: Para verificar qual a porta do servidor, terá que entrar na pasta onde esta instalado o cluster do postgresql e abrir o arquivo "postgresql.conf", dentro do mesmo contem uma linha "port = 5432". Okay, obrigado Thiago! 2015-10-20 5:55 GMT-02:00 Eloi <e...@openmailbox.org>: Eu entendo que se tem dois clusters funcionando na mesma maquina estes funcionam em diferentes portos, certo? Provavelmente a primeira instalação (9.1) estará ocupando o porto 5432 e a 9.3 outro, não sei qual (talvez 5431, 5433???). Como posso averiguar isso? Quando desinstalar a versão 9.1 como se pode mudar o porto da 9.3 para 5432? Vejo também que com o comando 'pg_lsclusters' posso ver que clusters tenho a rodando na maquina e em que porto. Saudações, -- Eloi Ribeiro Geoinformatic 51.9871, 5.6661 http://eloiribeiro.eu Links: -- [1] http://eloiribeiro.eu [2] 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
[pgbr-geral] PostgreSQL 9.1 e 9.3 na mesma maquina, remover 9.1
Ola a todos na lista, Um colega escreveu-me com o seguinte problema: Tem dois clusters funcionando na mesma maquina, PostgreSQL 9.1 e PostgreSQL 9.3. Quer remover a versão 9.1. Com o PgAdmin só se consegue ligar a versão 9.1 (especulo que só tenha tentado pelo porto por defeito, 5432). Eu entendo que se tem dois clusters funcionando na mesma maquina estes funcionam em diferentes portos, certo? Provavelmente a primeira instalação (9.1) estará ocupando o porto 5432 e a 9.3 outro, não sei qual (talvez 5431, 5433???). Como posso averiguar isso? Quando desinstalar a versão 9.1 como se pode mudar o porto da 9.3 para 5432? Muito obrigado! Comprimentos, Eloi -- Eloi Ribeiro Geoinformatic 51.9871, 5.6661 http://eloiribeiro.eu ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] ajuda com SELECT
Boa tarde a todos na lista, Gostaria de pedir ajuda para resolver a seguinte questão. Tenho os seguintes dados: 45101;"A";4 45101;"S";23 45102;"A";4 45103;"S";23 45104;"A";4 45105;"S";23 45105;"W";3 45106;"S";23 45107;"A";4 45108;"W";3 45108;"A";4 Na primeira coluna esta um valor que se repete. Na segunda coluna letras W, A e S, mas que podem ser outras. Na terceira coluna o 'peso' correspondente a cada uma das letras. Cada letra tem sempre o mesmo peso. Quero uma elaborar uma consulta onde: 1) o valor da primeira coluna não se repete 2) a letra da segunda coluna é a de menor peso 3) não se exclui os registos quando os valores da primeira coluna que não se repetem. Resultado esperado: 45101;"A";4 45102;"A";4 45103;"S";23 45104;"A";4 45105;"W";3 45106;"S";23 45107;"A";4 45108;"W";3 Obrigado! Atentamente, Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] RES: ajuda com SELECT
On 2015-10-01 18:01, Ricardo - Engsolutions wrote: create temp table teste(chave int, letra char(1), valor int); insert into teste(chave, letra, valor) values (45101,'A',4), (45101,'S',23), (45102,'A',4), (45103,'S',23), (45104,'A',4), (45105,'S',23), (45105,'W',3), (45106,'S',23), (45107,'A',4), (45108,'W',3), (45108,'A',4); selectx.chave, x.letra, x.valor from ( select chave, letra, valor, row_number() over(partition by chave order by chave, valor) AS classificacao from teste ) x where x.classificacao = 1 order by x.chave; drop table teste; Obrigado Ricardo, funciona perfeito! Vou guardar isto nas minhas notas, row_number() over(partition by chave order by chave, valor) AS classificacao Muito bom! Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Ajuda com função
On 2015-09-28 16:21, Sebastian Webber wrote: AND t2.country_id = '||$$'$$||country_code||$$'$$ Como você queria representar os dados? quote_ident vai colocar eles entre aspas duplas. Talvez o bloco todo possa ser reescrito com quote_literal: AND t2.country_id = QUOTE_LITERAL(country_code) Sim é isso, não conhecia QUOTE_LITERAL(), fica muito mais simples. Obrigado! Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Ajuda com função
On 2015-09-25 10:33, Eloi wrote: 1) A função não esta a funcionar devidamente. Suponho que relacionado com esta parte: AND t2.country_id = '||$$'$$||quote_ident(country_code)||$$'$$ Algo esta mal que não consigo identificar. O quote_ident() sobra, julgo que porque se trata de uma string e não de um objeto. Assim já funciona: AND t2.country_id = '||$$'$$||country_code||$$'$$ Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Query com geolocation
On 2015-06-09 19:23, Fabio Luis Rodrigues wrote: Retornar todos os endereços 2Km próximo de uma localização. Ex: Necessito retornar todas as filiais de lojas próxima a 2Km da casa do cliente. É possível fazer isso? Como seria aproximadamente esta query? Partindo do principio que uma distancia linear 'e suficiente podes usar a função ST_DWithin [1] de PostGIS [2]. SELECT f.loja, c.cliente FROM filial f INNER JOIN cliente c ON ST_DWithin(f.geog, c.geog, 2000); -- devolve todas as filiais que estão a menos de 2000 m do cliente Se ainda não tens a geometria nas tabelas filial e cliente: - ... ADD COLUMN geom(POINT,'epsg_code') - ... SET geom = ST_SetSRID( -- indica o sistema de coordenadas do ponto ST_MakePoint(x,y) -- cria a geometria do ponto de observação ,epsg_code) -- define o código EPSG do sistema de coordenadas do ponto [1] http://postgis.net/2013/08/26/tip_ST_DWithin [2] http://postgis.net/ Boa sorte. -- Eloi Ribeiro Geoinformatic 51.9871, 5.6661 http://eloiribeiro.eu ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] embeber código SQL ou PL/SQL em Latex?
On 2015-04-29 11:10, Eloi wrote: O que pretendo é o que o Euler mostrou com: psql -c \d mytable -o /tmp/foo.sql -P format=latex meubd Mas para varias tabelas que estão num determinado schema: SELECT relname FROM pg_class c INNER JOIN pg_namespace n ON (n.oid = c.relnamespace) WHERE relkind = 'r' AND nspname = 'myschema' ORDER BY relname; -- 46 tabelas E que o código que gere a descrição das tabelas fique e se execute dentro do próprio documento de latex. E que este uma vez compilado mostre apenas descrição das varias tabelas (\d mytable) presentes no schema 'myschema'. Não sei se isso é possível. Já encontrei a uma maneira para resolver o meu problema. A solução passou por usar código Python dentro de latex. Deixo aqui o resultado: \documentclass{article} \usepackage{python} \begin{document} \begin{python}% import psycopg2 from subprocess import Popen, PIPE, STDOUT def get_tables(schema): '''Get tables from a certain schema''' table_name_list = [] sql = ''' SELECT relname FROM pg_class c INNER JOIN pg_namespace n ON (n.oid = c.relnamespace) WHERE relkind = 'r' AND nspname = '%s' ORDER BY relname; ''' % schema cur.execute(sql) lines = cur.fetchall() for line in lines: table_name_list.append(line[0]) return table_name_list def get_tables_description(schema, table_name_list, dbname): '''Get tables description''' tables_descrition = '' for table_name in table_name_list: cmd = 'psql -c \d %s.%s -P format=latex %s' % (schema, table_name, dbname) p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True) output = p.stdout.read() tables_descrition = tables_descrition + output return tables_descrition # variables host = 'myhost' dbname = 'mydb' user = 'user' password = '' schema = 'myschema' # open connection to PostgreSQL conn = psycopg2.connect(host='%s' dbname='%s' user='%s' password='%s' % (host, dbname, user, password)); cur = conn.cursor() # execute functions table_name_list = get_tables(schema) tables_descrition = get_tables_description(schema, table_name_list, dbname) print tables_descrition # close connection to PostgreSQL conn.close() \end{python}% \end{document} Obrigado pelas dicas, foram fundamentais para chegar a esta solução. Cumprimentos, Eloi Ribeiro Geoinformatic 51.9871, 5.6661 http://eloiribeiro.eu ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] embeber código SQL ou PL/SQL em Latex?
On 2015-04-28 17:10, Euler Taveira wrote: Se você quiser a saída do psql, ele fornece um modo LaTeX. Veja: psql -c \d mytable -o /tmp/foo.sql -P format=latex meubd Nos meu relatórios técnicos eu costumo utiliza o pacote listings definindo a linguagem SQL (não faz o destaque de toda sintaxe do postgres mas já quebra um galho, além disso, há possibilidade de adicionar novas palavras chaves com lstset). Algo como: \begin{lstlisting} SELECT nspname || '.' || relname FROM pg_class c INNER JOIN pg_namespace n ON (n.oid = c.relnamespace) WHERE relkind = 'r' AND nspname 'information_schema' AND relname !~ '^pg_' \end{lstlisting} Obrigado pelas respostas, já me deram varias pistas. E desculpem-me pela ambiguidade da minha pergunta. Eu não quero mostrar código SQL no corpo do documento e que este fique com uma sintaxe destacada. Mas de todas as maneiras, obrigado, agora já sei como se faz. O que pretendo é o que o Euler mostrou com: psql -c \d mytable -o /tmp/foo.sql -P format=latex meubd Mas para varias tabelas que estão num determinado schema: SELECT relname FROM pg_class c INNER JOIN pg_namespace n ON (n.oid = c.relnamespace) WHERE relkind = 'r' AND nspname = 'myschema' ORDER BY relname; -- 46 tabelas E que o código que gere a descrição das tabelas fique e se execute dentro do próprio documento de latex. E que este uma vez compilado mostre apenas descrição das varias tabelas (\d mytable) presentes no schema 'myschema'. Não sei se isso é possível. Muito obrigado. Cumprimentos, Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] embeber código SQL ou PL/SQL em Latex?
Ola a todos, Estou a escrever documentação de uma base de dados em Latex e gostaria de, no anexo da documentação, listar todas as tabelas da base de dados mais detalhes (como por exemplo: as colunas que contem, ,comentário, gatilhos, constraints). Pergunta: É possível fazer isso embebendo código SQL ou PL/SQL no documento Latex? Obrigado. Cumprimentos, Eloi -- Eloi Ribeiro Geoinformatic 51.9871, 5.6661 http://eloiribeiro.eu ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Upgrade Postgis
On 2015-04-02 16:43, Leandro wrote: Pessoal, alguem que manja bem de postgis poderia me dar um help ... efetuei upgrade do meu postgis da versão 1.5 para 2.1 e conforme instruções do site do postigs efetuei o hard_upgrade da base ...perl utils/postgis_restore.pl [1] /somepath/olddb.backup | psql -h localhost -p 5432 -U postgres newdb 2 errors.txt acontece que me retornou varios erros de funções que não existem... Como minha base é antiga utilizei tambem o legacy.sql , os erros dimuinuiram mas ainda sim parece que varias funções não existem ... a ajuda que preciso é como fazer para não ocorrer esses varios erros de conversão? O que eu fiz quando tive de atualizar PostGIS de 1.5 para 2.x, foi: 1. passar a geometria para Well-Known Text (WKT), função ST_AsEWKT() 2. fazer um Dump sem o public schema (todas as minhas tabelas já estavam noutro schema) 3. criar uma base de dados com a nova versão de PostGIS 4. fazer o Restore do Dump na nova base 5. recriar a geometria e eliminar o Well-Known Text Boa sorte. Cumprimentos, -- Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] função para substituir inteiro por NULL
Olá a tod@s, Existe uma função para substituir um valor inteiro por NULL? Tentei com 'replace()' mas não dá. replace(smallint, integer, unknown) does not exist replace(h.oupsampl,-,NULL) Obrigado. Cumprimentos, Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] função para substituir inteiro por NULL
Existe uma função para substituir um valor inteiro por NULL? bom dia e o coalesce não resolve? coalesce(campo, -) Não resolve mas com essa dica já encontrei o que queria, é a função NULLIF(). O oposto de coalesce(). Resolvido. Obrigado! -- Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] função para substituir inteiro por NULL
On 2014-12-08 14:31, Eloi wrote: Existe uma função para substituir um valor inteiro por NULL? bom dia e o coalesce não resolve? coalesce(campo, -) Não resolve mas com essa dica já encontrei o que queria, é a função NULLIF(). O oposto de coalesce(). Resolvido. Obrigado! Obrigado pelas respostas entretanto enviadas. Sois muito rápidos :-) []'s Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] ajuda com consulta
Ola a todos da lista, Tenho uma tabela com possíveis combinações entre valores, e essas combinações repetem-se mas numa ordem distinta. Exemplo: 5;12842 5;62409 5;62410 12842;5 12842;62409 12842;62410 62409;5 62409;12842 62409;62410 62410;5 62410;12842 62410;62409 Como posso fazer uma consulta para selecionar apenas as combinações possíveis? 5;12842 5;62409 5;62410 Obrigado. Cumprimentos, Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] ajuda com consulta
Não entendi porque 12842;62409, 12842;62410 e 62410;62409 não entram no resultado, poderia explicar melhor? Não entendi o resultado desejado. Por que, por ex., o par (12842, 62410) não faz parte do resultado? Vou tentar explicar melhor. Esta tabela indica-me que: 5=12842 5=62409 5=62410 12842=5 12842=62409 12842=62410 62409=5 62409=12842 62409=62410 62410=5 62410=12842 62410=62409 Então se 5=12842, 5=62409 e 5=62410, já sei que 12842=62409, 12842=62410 e 62410=62409. Estes três últimos resultados estão a repetir a mesma informação. Esqueci-me de indicar isto no primeiro correio. Obrigado. Cumprimentos, Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] ajuda com consulta
On 2014-10-27 15:13, Matheus de Oliveira wrote: Agora está mais claro. Vamos lá, supondo a tabela dados(a int, b int), se não me enganei em algo, a seguinte consulta trará o resultado esperado: WITH elements(a,b) AS ( SELECT DISTINCT least(a, b), greatest(a, b) FROM dados ) SELECT e1.* FROM elements e1 WHERE NOT EXISTS(SELECT 1 FROM elements e2 WHERE e1.a = e2.b); a | b ---+--- 5 | 12842 5 | 62410 5 | 62409 (3 rows) Verifique em seus dados se atingem o resultado esperado. Perfeito! Passei de 82978 resultados para 21407 esperados. Muito obrigado! Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] ERROR: could not write to hash-join temporary file: No space left on device
Ola, Estou a tentar criar uma vista materializada e tenho sempre a seguinte mensagem de erro: ERROR: could not write to hash-join temporary file: No space left on device Embora na partição root tenha 10 Gb de espaço livre e na partição /home 480 Gb livres. A base de dados está numa tablespace em /home/basedados. Porque isto acontece quando existe espaço livre e como posso contornar ou resolver este problema? Detalhes do software: SELECT version(); version -- PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2, 64-bit Obrigado. Cumprimentos, Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] ERROR: could not write to hash-join temporary file: No space left on device
A base de dados está numa tablespace em /home/basedados. Acabo de me dar conta que a base de dados esta em TABLESPACE = pg_default, poder ser este o motivo. Eloi Ribeiro ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] ERROR: could not write to hash-join temporary file: No space left on device
A base de dados está numa tablespace em /home/basedados. Acabo de me dar conta que a base de dados esta em TABLESPACE = pg_default, poder ser este o motivo. Resolvido com: ALTER DATABASE test SET TABLESPACE basedados; -- Eloi Ribeiro ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] remover ' de um texto
Ola, Tenho uns quantos registos com o símbolo ' no meio do texto e gostaria de remove-lo. Como posso fazer isso? Seria algo como isto mas falta-lhe algo: SELECT replace(campo, ' CALLOSA D'EN SARRIÁ' , ''); Obrigado, Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] remover ' de um texto
On 16-07-14 20:49, Rodrigo Waters wrote: SELECT REPLACE( $$marca d'agua$$, $$'$$, '' ) Obrigado! Não conhecia esse truque. Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] ajuda com funcao
Ola a todos os participantes da lista, Gostaria de fazer uma função que: 1. verifica-se se um determinado valor já existe numa tabela 2. se sim, que me devolva o id desse registo 3. se não, que faca o insert e em seguida devolva o id resultante Escrevi a seguinte código mas falta-me saber como recuperar o resultado do EXECUTE. Alguém me pode ajudar? Obrigado. CREATE OR REPLACE FUNCTION Attribute.fun_insert_attribute(name text, description text, type text) RETURNS text AS $BODY$ DECLARE attribute_id integer; n integer; BEGIN -- verifica se já existe EXECUTE 'SELECT count(*) FROM Attribute.Attribute WHERE Name ILIKE '||name||';' -- se já existe, conhecer o id IF n 1 THEN EXECUTE 'SELECT AttributeId FROM Attribute.Attribute WHERE Name ILIKE '||name||';' -- se não existe, inserir e conhecer o id ELSE EXECUTE 'INSERT INTO Attribute.Attribute(Name,Description,version_type) VALUES('||name||','||description||','||type||') RETURNING AttributeId;' END IF; RETURN attribute_id; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; Os melhores cumprimentos, -- Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] ajuda com funcao
On 2014-06-13 12:02, Matheus de Oliveira wrote: 2014-06-13 6:39 GMT-03:00 Eloi Ribeiro e...@openmailbox.org: Em primeiro lugar, você não precisaria do EXECUTE, basta executar os comandos SQL diretamente. No seu caso o EXECUTE não é só ruim, está **errado**, pois não trata corretamente escape e está suscetível à SQL-injection. Obrigado, isso era o que me faltava saber. Agora, se quer recuperar o valor, mas caso não tenha inserir, basta usar a variável FOUND (ainda não está bom, veja as considerações abaixo): Muito melhor a solução que apresentas, poupo um passo. Agora, essa função apesar de **aparentemente** fazer o que você quer, ainda tem diversos possíveis problemas: 1. Você busca usando ILIKE (até troquei por lower+LIKE, por ser mais eficiente), mas o que acontece se retornar mais de um registro? Poderia acontecer? No caso acima o PG irá pegar um deles arbitrariamente (na sorte mesmo). Será que você não queria ter usando igualdade? O campo Name é único (tem chave UNIQUE)? Tem um UNIQUE, não existem valores repetidos. 2. A função não está tratando concorrência. Imagine o que acontece se você fizer o SELECT, não retornar nada, mas quando for fazer um INSERT alguém acabou de um Name que casaria. Se Name for UNIQUE vai dar um problemão; se não, só vai ser estranho e acho que você deveria repensar seriamente no seu modelo de dados e suas operações (me cheira mal, mas tenho pouca informação para afirmar). Não deveria passar porque nesta tabela só podem inserir valores muito pouca gente. Mas terei cuidado com isso. 3. Por que está usando nomes de tabelas e atributos com aspas duplas? Não acha que fica horrível de usar assim depois? (esse não é um problema de fato, só uma prática ruim na minha opinião). Eu também não gosto nada e da-me muitas dores de cabeça quando tenho de escrever código em Python. Pois todo o banco de dados, todos os objetos estão em PascalCase, uma loucura. Cada vez que tenho de por uma aspa () tenho de pressionar 3 teclas! E não imaginas o que me custou de convencer-lhes de que isto não é o mais ótimo. Mas se fosse só isso... A função ficou assim: CREATE OR REPLACE FUNCTION Attribute.fun_insert_attribute(name text, description text, type text) RETURNS text AS $BODY$ DECLARE attribute_id integer; BEGIN -- verifica se ja existe e devolve o id SELECT AttributeId INTO attribute_id FROM Attribute.Attribute WHERE lower(trim(Name)) LIKE lower(trim(name)); -- se nao existe, inserir e conhecer o id IF NOT FOUND THEN INSERT INTO Attribute.Attribute(Name,Description,version_type) VALUES(trim(name),trim(description),trim(type)) RETURNING AttributeId INTO attribute_id; END IF; RETURN attribute_id; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; -- Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Migração de postgres + solr para postgres + postGIS
On 2014-03-20 22:41, Sidnei Vladisauskis wrote: Muito Obrigado, era o que estava pensando a única dúvida que fiquei é no ST_Point_Inside_Circle, o que seria o geometry a_point? ST_Point_Inside_Circle(geometry a_point, float center_x, float center_y, float radius); geometry a_point - geometria do ponto do qual queres saber se esta dentro ou não do circulo float center_x, float center_y - centro do circulo float radius - raio do circulo A função devolve TRUE / FALSE. http://postgis.net/docs/manual-2.0/ST_Point_Inside_Circle.html -- Eloi Ribeiro ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Migração de postgres + solr para postgres + postGIS
On 2014-03-19 02:38, Sidnei Vladisauskis wrote: Mas como faço para começar a utilizar o PostGis em um BD já existente? 1) Instala PostGIS, recomendo versão = 2.0 2) Criar a extensão no teu banco: psql -d a_tua_base -c CREATE EXTENSION postgis; Se num futuro atualizas o PostGIS: psql -d postgis -c 'ALTER EXTENSION postgis UPDATE TO 2.x.x;' 3) Adicionar campo com geometria: ALTER TABLE tabela ADD COLUMN geom geometry(POINT, codigo_epsg); -- codigo_epsg para WGS48 = 4326 4) Preencher campo: UPDATE tabela SET coluna = ST_SetSRID(ST_Makepoint(long,lati), codigo_epsg); Eu queria só fazer um select no postgres com a geolocalização do usuário, um raio específico e trazer todos spots e seus dados naquele raio. Como posso fazer isso? Para isto podes usar a função ST_Point_Inside_Circle(geometry a_point, float center_x, float center_y, float radius) Ou as funcoes ST_Intersects(ST_Buffer(geom, valor_raio)) Alguém tem um tutorial ou algum exemplo de como faço isso? Manual de PostGIS: http://postgis.net/docs/manual-2.1/index.html -- Eloi Ribeiro ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] duvida com as aspas dentro de aspas ao criar função
Como faço para passar o valor como inteiro? Realmente, o next_value devia ser passado como inteiro, não literal. Para resolver isso, basta usar o %s ao invés de %L. Este irá alocar o valor diretamente, por isso recomendo um CAST no parâmetro (ele já é inteiro, mas é só para garantir 100% que não haverá erros): format('CREATE SEQUENCE %I.%I START %s OWNED BY %I.%I.%I;', , row.next_value::int, ...); OK! Mudando o %L por %s já passa o valor como inteiro e funciona (mesmo sem o cast ::int). A função ficou assim. CREATE OR REPLACE FUNCTION wosis.fun_create_sequence(sch text) RETURNS text LANGUAGE plpgsql VOLATILE AS $BODY$ DECLARE row record; BEGIN FOR row IN SELECT table_name, table_name||'_id' AS id_name, 0 AS next_value FROM information_schema.tables WHERE table_schema = sch AND table_type = 'BASE TABLE' ORDER BY table_name LOOP EXECUTE format( 'SELECT max(%I)+1 FROM %I.%I;', row.id_name, sch, row.table_name) INTO row.next_value; EXECUTE format( 'CREATE SEQUENCE %I.%I START %s OWNED BY %I.%I.%I;', sch, row.table_name||'_'||row.id_name||'_seq', row.next_value, sch, row.table_name, row.id_name ); EXECUTE format( 'ALTER TABLE %I.%I ALTER COLUMN %I SET DEFAULT nextval(%L);', sch, row.table_name, row.id_name, sch || '.' ||row.table_name||'_'||row.id_name||'_seq' ); END LOOP; RETURN 'Sequences were created'; END; $BODY$; ALTER FUNCTION wosis.fun_create_sequence(text) OWNER TO postgres; COMMENT ON FUNCTION wosis.fun_create_sequence(text) IS 'Create sequences in all tables in a given schema'; Muito obrigado pela ajuda! []'s Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] duvida com as aspas dentro de aspas ao criar função
É, parece que você criou uma bagunça com as aspas mesmo... Acho que vai ficar mais fácil refazer a função do que ajustar cada problema nela. Já que vamos refazer, que tal adicionar algumas dicas de ouro? ;-) Bom, primeiro, veja o modelo que criei (não testei, então pode ter algum erro que eu não tenha visto): CREATE OR REPLACE FUNCTION wosis.fun_create_sequence(sch text) RETURNS text LANGUAGE plpgsql VOLATILE AS $BODY$ DECLARE row record; BEGIN FOR row IN SELECT table_name, table_name||'_id' AS id_name, 0 AS next_value FROM information_schema.tables WHERE table_schema = sch AND table_type = 'BASE TABLE' ORDER BY table_name LOOP EXECUTE format('SELECT max(%I)+1 FROM %I.%I', row.id_name, sch, row.table_name) INTO row.next_value; EXECUTE format( 'CREATE SEQUENCE %I.%I START %L OWNED BY %I.%I.%I;', sch, row.table_name||'_'||row.id_name||'_seq', row.next_value -- faltava sch, row.table_name, row.id_name ); EXECUTE format( 'ALTER TABLE %I.%I ALTER COLUMN %I SET DEFAULT nextval(%L);', -- AQUI FALTAVA A VIRGULA sch, row.table_name, row.id_name, row.table_name||'_'||row.id_name||'_seq' ); END LOOP; RETURN 'Sequences were created'; END; $BODY$; Agora vejamos... Em primeiro lugar eu não usei uma tabela temporário, simplesmente porque não vi sentido, e acho que acabou deixando a função mais confusa ainda. Ao invés disso eu apenas naveguei no resultado da consulta à view information_schema.tables. Repare também que não usei consulta dinâmica (comando EXECUTE) nesta consulta, simplesmente porque não é necessário e recomendo evitar o uso de EXECUTE ao máximo. Em segundo lugar, precisamos de três comandos, um para fazer um `SELECT max` para recuperar o maior valor, outro para criar a sequência e o último para alterar o DEFAULT da tabela. Em ambos os casos a função format ajuda bastante, e não precisa de tantos quote_ident's, que podem ser confusos. Em [1] há um comparativo legal entre format e quote_ident. Veja lá e poste dúvidas que sobrarem aqui. Por fim, adicionei a cláusula OWNED BY no CREATE SEQUENCE, para deixar idêntico ao que o pseudo-tipo SERIAL faz, e é uma boa prática para futuras manutenções. Só tenho mais um comentário. Esses comandos estão (talvez erroneamente) assumindo que toda tabela tem um campo nome da tabela_id, mas talvez faça parte do seu modelo, mas eu evitaria isso, a não ser que seja algo executado somente numa tarefa administrativa. Ufa... Leia com calma, tentei ser o mais claro possível. ^^ [1] http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-QUOTE-LITERAL-EXAMPLE Atenciosamente, Obrigado a todos pelas respostas e desculpar-me por não responder antes. Gostei das dicas do 'format()', muito parecido ao python e também do 'INTO row.next_value', não conhecia. E sem duvida que conceptualmente a função ficou muito melhor, não complicou. Parece que terei de rever todas as minhas funções que estive a escrever na ultima semana. Sim, todas as tabelas tem o nome da tabela_id, fiz uma função para que assim fosse. E sim, é apenas uma tarefa administrativa num esquema com 70 tabelas. Foi necessário uns retoques minimos, uma virgula que falatva e passar o valor de row.next_value. Agora só falta um detalhe, esta a passar o valor de 'next_value' como texto e salta erro. Tentei o 'cast' (::int) mas parece-me que isso é apenas para o puro SQL. ERROR: syntax error at or near '25476' LINE 1: ...E SEQUENCE wosis.class_fao_class_fao_id_seq START '25476' OW... ^ QUERY: CREATE SEQUENCE wosis.class_fao_class_fao_id_seq START '25476' OWNED BY wosis.class_fao.class_fao_id; CONTEXT: PL/pgSQL function fun_create_sequence line 19 at EXECUTE statement Como faço para passar o valor como inteiro? Muito obrigado a todos pelas sugestões, correções e explicações. Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] duvida com as aspas dentro de aspas ao criar função
Ola a todos, Estou a tentar criar uma função que crie sequencias em todas as tabelas num determinado esquema e não consigo avançar por causa das aspas dentro de aspas, alguém pode dar uma ajuda. Aqui está o código, e o problema com as aspas esta no primeiro e no terceiro EXECUTE: CREATE OR REPLACE FUNCTION wosis.fun_create_sequence(sch text) RETURNS text AS $BODY$ DECLARE row record; BEGIN EXECUTE ' CREATE TEMP TABLE tmp AS SELECT table_name, table_name||_id' AS id_name, 0 AS next_value FROM information_schema.tables WHERE table_schema = sch AND table_type = 'BASE TABLE' ORDER BY table_name;'; FOR row IN SELECT table_name, id_name FROM tmp ORDER BY table_name LOOP EXECUTE 'UPDATE tmp SET next_value = (SELECT max(' || quote_ident(row.id_name) || ')+1 FROM ' || quote_ident(sch) || '.' || quote_ident(row.table_name) || ') WHERE table_name = ' || quote_ident(row.table_name) || ';' END LOOP; FOR row IN SELECT table_name, id_name, next_value FROM tmp ORDER BY table_name LOOP EXECUTE 'CREATE SEQUENCE ' || quote_ident(row.table_name) || '_' || quote_ident(row.id_name) || '_seq START ' || quote_ident(row.next_value) || ';' EXECUTE 'ALTER TABLE ' || quote_ident(sch) || '.' || quote_ident(row.table_name) || ' ALTER COLUMN ' || quote_ident(row.id_name) || ' SET DEFAULT nextval( ' || quote_ident(row.table_name) || '_' || quote_ident(row.id_name) || '_seq);' END LOOP; RETURN 'Sequences were created'; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION wosis.fun_create_sequence(text) OWNER TO postgres; COMMENT ON FUNCTION wosis.fun_create_sequence(text) IS 'Create sequences in all tables from a given schema'; Obrigado, -- Eloi Ribeiro GIS Analyst / Programmer 51.9871, 5.6661 flavors.me/eloiribeiro ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] RES: Extensões mais úteis para o PostgreSQL
On 2014-01-09 20:34, Marcelo Costa wrote: Estou aceitando dicas de extensões para o elefante que vocês considerem mais úteis em seu dia a dia. PostGIS ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] ajuda com função
Ola a toda a lista, Estou a tentar fazer funcionar a seguinte função para mover todas as tabelas de um esquema para outro. Não obtenho nenhum erro mas no entanto nada é movido. Peculiaridades: o nome do esquema de origem está em PascalCase e o de destino em minúsculas. Alguém me pode indicar o que estou a fazer mal? CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text) RETURNS text AS $BODY$ DECLARE row record; BEGIN FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = sch_from LOOP EXECUTE 'ALTER TABLE ' || sch_from || '.' || quote_ident(row.tablename) || ' SET SCHEMA ' || sch_to || ';'; END LOOP; RETURN 'Tables were moved'; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION sys_move_tables(text, text) OWNER TO postgres; SELECT sys_move_tables('OrigEm', 'destino'); Obrigado. Cumprimentos, Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] ajuda com função
On 2013-12-18 15:23, Matheus de Oliveira wrote: 2013/12/18 Eloi e...@openmailbox.org Ola a toda a lista, Estou a tentar fazer funcionar a seguinte função para mover todas as tabelas de um esquema para outro. Não obtenho nenhum erro mas no entanto nada é movido. Peculiaridades: o nome do esquema de origem está em PascalCase e o de destino em minúsculas. Alguém me pode indicar o que estou a fazer mal? CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text) RETURNS text AS $BODY$ DECLARE row record; BEGIN FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = sch_from LOOP EXECUTE 'ALTER TABLE ' || sch_from || '.' || quote_ident(row.tablename) || ' SET SCHEMA ' || sch_to || ';'; END LOOP; RETURN 'Tables were moved'; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION sys_move_tables(text, text) OWNER TO postgres; SELECT sys_move_tables('OrigEm', 'destino'); Obrigado. Cumprimentos, Simples. Sua função não executa nada por causa da seguinte consulta: SELECT tablename FROM pg_tables WHERE schemaname = sch_from; Veja que você passou 'OrigEm' para sch_from, logo essa consulta ficaria: SELECT tablename FROM pg_tables WHERE schemaname = 'OrigEm'; Mas nas tabelas de catálogo, os nomes são armazenados diretamente, sem aspas duplas, logo sua consulta não traz nenhum registros e o loop não é executado. A solução é não passar com aspas duplas na chamada da função e tratar dentro da mesma: CREATE OR REPLACE FUNCTION sys_move_tables(sch_from text, sch_to text) RETURNS text AS $BODY$ DECLARE row record; BEGIN FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = sch_from LOOP EXECUTE 'ALTER TABLE ' || quote_ident(sch_from) || '.' || quote_ident(row.tablename) || ' SET SCHEMA ' || quote_ident(sch_to) || ';'; END LOOP; RETURN 'Tables were moved'; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; SELECT sys_move_tables('OrigEm', 'destino'); Atenciosamente, -- Matheus de Oliveira Analista de Banco de Dados Dextra Sistemas - MPS.Br nível F! www.dextra.com.br/postgres [1] Certo, já funciona. Obrigado pela ajuda! Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] ajuda com função
On 18-12-13 18:51, Guimarães Faria Corcete DUTRA, Leandro wrote: 2013/12/18 Eloi Ribeiro e...@openmailbox.org: On 2013-12-18 15:23, Matheus de Oliveira wrote: www.dextra.com.br/postgres [1] Certo, já funciona. Sim, a Dextra funciona, e o PostgreSQL também. Brincadeirinha… mas como você não cortou nem sequer a assinatura da mensagem a que respondeu, foi como o gMail me mostrou tua resposta. Além de evitar o /top posting/, outro ponto da netiqueta — não lembro se chega a estar na RFC 1855 — é cortar da mensagem respondida tudo a que não se está respondendo diretamente, a menos que seja importante para contextualizar. E evita esses efeitos colaterais engraçados. Estava eu a pensar por onde cortar quando respondi mas não sabia por onde e decidi não cortar. Não conhecia esse critério, terei em conta na próxima vez. Sim, esta na 'RFC 1855' (também ignorava): 'When replying to a message, include enough original material to be understood but no more.' Sempre aprender :-) ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] separar caracteres minúsculos dos maiúsculos
Ola, Tenho uma coluna de texto com códigos geológicos tipo: lKv uMIsn CASi K CAS Gostaria de separar os caracteres minúsculos dos maiúsculos, obtendo o seguinte resultado: min_prefixo,maiusculos,min_sufixo l,K,v u,MI,sn ,CAS,i ,K, ,CAS, A dificuldade que encontro deve-se a que não existe uma longitude fixa para todos os casos. Cumprimentos, Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] separar caracteres minúsculos dos maiúsculos
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 On 10/12/2013 05:48 PM, Osvaldo Kussama wrote: Em 12/10/13, Guimarães Faria Corcete DUTRA, Leandrol...@dutras.org escreveu: 2013/10/12 Eloi Ribeiro e...@openmailbox.org: Gostaria de separar os caracteres minúsculos dos maiúsculos Expressões regulares? Na linha proposta pelo Dutra: SELECT regexp_replace(foo, '(^[a-z]*)([A-Z]*)([a-z]*)', E'\\1,\\2,\\3', 'g') FROM (VALUES ('lKv'), ('uMIsn'), ('CASi'), ('K'), ('CAS')) AS bar(foo); regexp_replace l,K,v u,MI,sn ,CAS,i ,K, ,CAS, (5 rows) Osvaldo Até agora só tinha usado o LIKE / ILIKE com %. Fui ver o que era isso de 'Expressões regulares' e quase termino com dores de cabeça. Muito duro. Tinha até chegado aqui, depois de algum tempo de testes: SELECT substring('lbcCASsvn', '^([a-z]{1,5})'); -- lbc SELECT substring('lbcCASsvn', 'Y*([A-Z]{1,5})'); -- CAS SELECT substring('lbcCASsvn', 'A*([a-z]{1,5})$'); -- svn Mas a solução do Osvaldo é muito mais elegante. Dutra muito obrigado pela acertada dica. E Osvaldo pela precisa solução. Cumprimentos, Eloi -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQEcBAEBAgAGBQJSWYqeAAoJEP9qulIE6g+y1bMH/jv6NxggjUMcB2DUbSWt3l1Q FbIEErwV0ofmlsHqcpx4ukGO62hyWZ+8xVaeceAnXXfnms5orCqnNWT2oahRaN+n 7Zcqt0sZzgzpU+ghkBRLm8LP4EhNEp+agE1/l1H7NukdhRGFO/peao0rkhXJ9CIK b4FZmChGI/+V0aa1Al5pKN/q0eb2xHa5i4PTXvugO6gxws0iUEdWFn1Ex4hjFeEt gMxd8eEMg0EAu2smWCFBU08FdUPkTqHVldoaQydAJHAsgJSSyRptPvEaIRwkpvwV Ox0lrirfQnd71r/KgcOK0rUAjo6gCsDmvdUXpmTXl29FtdUszNOi5yz4SUFi4QE= =o7c9 -END PGP SIGNATURE- ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] armazenamento de rasters
-BEGIN PGP SIGNED MESSAGE- Hash: SHA1 On 10/04/2013 08:23 PM, Guimarães Faria Corcete DUTRA, Leandro wrote: 2013/10/4 mario henrique mario.geotecnol...@gmail.com: Olá Pessoal, não encontrei nas listas nada sobre o armazenamento de imagens georreferenciadas. Hm, realmente o ideal é começar pela documentação. Nas listas tende a haver mais respostas a dúvidas específicas. Já olhaste a documentação do PostGIS? Neste blog poderás encontrar exemplos de grande utilidade sobre esse tema. http://duncanjg.wordpress.com/category/postgis/ Boa sorte, Eloi -BEGIN PGP SIGNATURE- Version: GnuPG v1.4.11 (GNU/Linux) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQEcBAEBAgAGBQJSU8SZAAoJEP9qulIE6g+yrGEH/i3Dz69AqsBMc4cjN9X4zUGV 4Pt7HN6UBEGTY1TdCno7BnQiml2vxgjFOHg8Lux7bBNbc4Og8Mx7yf7KTKmV+kvI 8ZuwnXoucqbxG6H/J3SH7YTGTWeKftbW1+E/bhK1hV7Bm7xvxZCAgBbsPo/zuRBH 5mwzpDXNlghiLmleGOel6PKCl2OnhcF8SJMvkF9OHa7qfW/ogH1fsPO0dWsgr/VV Rp1l+SBqs/ERKeQBHkgbu0BMby3h33+pCMZxiRHCui1U+xe8zNxn3hAb+fWYz+HH 2/egYnSaP2/wf/Je6sxaiIo2Hv1R/vRxKtwNggS0/+zleZhc9MJXF5JkVCxAX44= =V00e -END PGP SIGNATURE- ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] Consulta com 'NOT IN' devolve resultado não esperado
Ola a todos, Tenha duas tabelas com estações meteorológicas e quero saber quais são as estações que estão numa tabela (tmp_estaciones) mas não na outra (es_estaciones). Para tal executo a seguinte consulta: SELECT indicativo FROM sch_meteo.tmp_estaciones WHERE indicativo NOT IN ( SELECT codigo FROM sch_meteo.es_estaciones); -- 0 rows retrieved. De antemão eu sei que há estações em 'tmp_estaciones' que não estão em 'es_estaciones'. Assim que o resultado não deveria ser zero linhas. As seguintes consultas comprovam isso mesmo: SELECT indicativo FROM sch_meteo.tmp_estaciones WHERE indicativo = 'C917E'; -- 1 row retrieved. SELECT codigo FROM sch_meteo.es_estaciones WHERE codigo = 'C917E'; -- 0 rows retrieved. O quê que estou a fazer mal? Obrigado. Cumprimentos, Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Consulta com 'NOT IN' devolve resultado não esperado
Seria mais interessante você utilizar a combinação de consultas, no seu caso eu usaria o EXCEPT [1], resumindo seria: SELECT indicativo FROM sch_meteo.tmp_estacione EXCEPT SELECT codigo FROM sch_meteo.es_estaciones; Nao conecia o EXCEPT nem o comportamento padrão do NOT IN, estava a fazer uma interpretação literal. Com esta lista estamos sempre a aprender. Obrigado! Agora funciona na perfeição: SELECT indicativo FROM sch_meteo.tmp_estaciones EXCEPT SELECT codigo FROM sch_meteo.es_estaciones; -- 17 rows retrieved. Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] PostGis
Importing with configuration: municipios, public, geom, C:\Users\Jonnathann\Desktop\Shapefiles\Municipios, mode=c, dump=1, simple=0, geography=0, index=1, shape=1, srid=0 Unable to convert field name to UTF-8 (iconv reports Invalid argument). Current encoding is UTF-8. Try LATIN1 (Western European), or one of the values described at http://www.gnu.org/software/libiconv/. Shapefile import failed. Se estas a usar shp2pgsql utiliza o parâmetro '-W' para indicar a codificação do shapefile. Se tens o shapefile en latin1, deveria ser '-W iso-8859-1'. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] PostGis
como assim amigo usar o parametro -W? onde usar? É que eu sou novo no postgis, poderia me explicar melhor? Não indicaste que método usas para subir os shapes a PostgreSQL. Assumindo que usas o shp2pgsql, seria assim: shp2pgsql -s 4326 -g geom -D -I -W iso-8859-1 C:\Users\Jonnathann\Desktop\Shapefiles\Municipios.shp tb_municipios bd_nome | psql -d bd_nome Parametros shp2pgsql: -s srid Set the SRID field. Defaults to -1. (-d|a|c|p) These are mutually exclusive options: -d Drops the table, then recreates it and populates it with current shape file data. -a Appends shape file into current table, must be exactly the same table schema. -c Creates a new table and populates it, this is the default if you do not specify any options. -p Prepare mode, only creates the table. -g geocolumn Specify the name of the geometry/geography column (mostly useful in append mode). -D Use postgresql dump format (defaults to SQL insert statments. -G Use geography type (requires lon/lat data). -k Keep postgresql identifiers case. -i Use int4 type for all integer dbf fields. -I Create a spatial index on the geocolumn. -S Generate simple geometries instead of MULTI geometries. -W encoding Specify the character encoding of Shape's attribute column. (default : WINDOWS-1252), iso-8859-1 (codificacao Latin-1) -N policy NULL geometries handling policy (insert*,skip,abort) -n Only import DBF file. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Saber a dif min entre timestamp's de duas tabelas
Obrigado pela dica Tiago, a consulta funciona muito melhor com essa dica. Ficou assim: *SELECT DISTINCT ON (f.ficheiro) * * f.ficheiro,* * (f.photo_datetimeoriginal - '00:03:22'::interval) - (p.time + '02:00:00'::interval) AS dif_ts, * * ST_X(p.geom) AS x, * * ST_Y(p.geom) AS y * *FROM sch_forestal.fotos AS f, * * sch_forestal.gps_track_points AS p* *WHERE (p.time + '02:00:00'::interval) * * BETWEEN (f.photo_datetimeoriginal - '00:03:22'::interval - '00:00:05'::interval) * * AND (f.photo_datetimeoriginal - '00:03:22'::interval + '00:00:05'::interval)* *ORDER BY f.ficheiro;* Agora vejo que testando com diferentes margens de erro obtenho diferentes resultados. Nao existe uma maneira de que me devolva a diferença minima existente estre os dois timestamps? -- '00:00:*10*'::interval ficheiro;dif_ts;x;y 2012-07-17-11-13-06.jpg;*00:00:04*;718135.21515306;4380177.22342103 2012-07-17-11-13-15.jpg;*-00:00:02*;717996.344046553;4380255.12938927 2012-07-17-11-22-21.jpg;*-00:00:04*;708842.044380715;4388544.55736434 -- '00:00:*30*'::interval ficheiro;dif_ts;x;y 2012-07-17-11-13-06.jpg;*-00:00:15*;717947.652491031;4380279.53855042 2012-07-17-11-13-15.jpg;*-00:00:08*;717922.784056217;4380296.11437229 2012-07-17-11-22-21.jpg;*00:00:30*;709698.090967436;4388139.22602785 Obrigado pela ajuda, Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 27 de Julho de 2012 19:20, Tiago Adami adam...@gmail.com escreveu: Em 27 de julho de 2012 12:50, Eloi Ribeiro eloi.ribe...@gmail.com escreveu: A primeira ideia era que fosse um producto cartesiano mas pensando melhor poderia utilizar a data(ano-mes-dia) para restringir e acelarar um pouco a consulta. Em defenitiva a ideia e encontrar o ponto com o timestamp mais proximo para cada timestamp de cada foto. Olá Eloi, Na exatidão da matemática não há uma noção de próximo ou longínquo, as grandezas precisam ser definidas. Dito isto, qual seriam os seus limites de próximo? Acredito que neste caso você queira manter uma margem de erro para baixo e para cima para encontrar seus registros. Se você definir esta margem, poderá fazer uma consulta de todos os pontos que se enquadram nesta proximidade relativa com o predicado - usando como exemplo margem de erro de 02:00:00: (...) p.ponto_ts BETWEEN (f.foto_ts - '02:00:0'::interval) AND (f.foto_ts + '02:00:0'::interval) * pode ser que o código não funcione, não tenho como testar agora. -- TIAGO J. ADAMI http://www.adamiworks.com ___ 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
[pgbr-geral] Saber a dif min entre timestamp's de duas tabelas
Ola a todos, Tenho uma tabela com o timestamp de fotos (fotos.foto_ts) e outra com o timestampe de pontos (pontos.ponto_ts). E a minha intenção é geo-referenciar estas fotos por aproximação entre os timestamps, calculando a diferença mínima entre eles. Executei a seguinte consulta: *SELECT DISTINCT ON (f.foto)* * f.foto, * * ST_X(p.geom), * * ST_Y(p.geom)* *FROM fotos AS f, * * pontos AS p* *ORDER BY f.foto, * * (f.foto_ts - '00:03:22'::interval) - (p.ponto_ts + '02:00:00'::interval);* *(f.foto_ts - '00:03:22'::interval)* - ajusta a hora da câmara de fotos. *(p.ponto_ts + '02:00:00'::interval)* - ajusta o hora do satélite (solar). O problema é que demora muito (parei quando ia pelos 5 minutos) ou a consulta está mal elaborada. Alguma dica? Obrigado, Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Saber a dif min entre timestamp's de duas tabelas
A primeira ideia era que fosse um producto cartesiano mas pensando melhor poderia utilizar a data(ano-mes-dia) para restringir e acelarar um pouco a consulta. Em defenitiva a ideia e encontrar o ponto com o timestamp mais proximo para cada timestamp de cada foto. No dia 27 de Jul de 2012 14:46, Guimarães Faria Corcete DUTRA, Leandro l...@dutras.org escreveu: ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] Fwd: [SIG] Database/Programming specialist - Wageningen, Netherlands
-- Forwarded message -- From: Date: 2012/3/31 Subject: [SIG] Database/Programming specialist - Wageningen, Netherlands To: s...@listserv.rediris.es Database/Programming specialist - Wageningen, Netherlands http://www.peer.eu/opportunities/vacancies/details/?tx_list_pi1%5Buid%5D=118tx_list_pi1%5Bmode%5D=5cHash=93a600cde1bdc0b393eba453b757451c Normas para el correcto uso del correo electrónico: http://www.rediris.es/mail/estilo.html ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] Trigger não dispara
Olá a todos, Estou numa maquina com Ubuntu Desktop 10.04, PostgreSQL 8.4 e PostGIS 1.5. e não consigo fazer com que um trigger me funcione. Vou tentar reproduzir o erro aqui: CREATE TABLE t_incendio (gid serial PRIMARY KEY, codigo bigint); SELECT AddGeometrycolumn ('public','t_incendio','geom',23030,'MULTIPOLYGON',2); CREATE TABLE t_areaprotegida (gid serial PRIMARY KEY, tipo varchar(10), nome varchar(10)); SELECT AddGeometrycolumn ('public','t_areaprotegida','geom',23030,'MULTIPOLYGON',2); CREATE TABLE t_relatorio (id serial PRIMARY KEY, codigo bigint, tipo varchar(10), nome varchar(10)); CREATE OR REPLACE FUNCTION fun_teste() RETURNS trigger AS $BODY$ BEGIN IF (TG_OP = 'INSERT') THEN INSERT INTO t_relatorio(codigo,tipo,nome) (SELECT i.codigo, a.tipo, a.nome FROM t_incendio AS i, t_areaprotegida AS a WHERE (i.geom a.geom) AND ST_Intersects(i.geom,a.geom) GROUP BY i.codigo, a.tipo, a.nome HAVING i.codigo = NEW.codigo); ELSIF (TG_OP = 'DELETE') THEN DELETE FROM t_relatorio WHERE codigo = OLD.codigo; END IF; RETURN NEW; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; CREATE TRIGGER trg_t_incendio BEFORE INSERT OR UPDATE ON t_incendio FOR EACH ROW EXECUTE PROCEDURE fun_teste(); INSERT INTO t_areaprotegida (tipo, nome, geom) VALUES ('P. Natural', 'Bosque', ST_GeomFromText('MULTIPOLYGON(((67 435,68 435,68 434,67 434,67 435)))',23030)); SELECT * FROM t_areaprotegida; 1;P. Natural;Bosque;010620F659010... INSERT INTO t_incendio (codigo, geom) VALUES (99, ST_GeomFromText('MULTIPOLYGON(((675000 435,685000 435,685000 434,675000 434,675000 435)))',23030)); SELECT * FROM t_incendio; 1;99;010620F6590100010300010... SELECT * FROM t_relatorio; Nada! Esta é a consulta que está na funçao fun_teste(): SELECT i.codigo, a.tipo, a.nome FROM t_incendio AS i, t_areaprotegida AS a WHERE (i.geom a.geom) AND ST_Intersects(i.geom,a.geom) GROUP BY i.codigo, a.tipo, a.nome; 99;P. Natural;Bosque O que é que estou a fazer mal? Obrigado. Cumprimentos, Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Trigger não dispara
Era isso Danilo, muito obrigado. Resolvido! Att. Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 26 de Março de 2012 14:30, Danilo Silva danilo.dsg.go...@gmail.comescreveu: Em 26 de março de 2012 07:36, Eloi Ribeiro eloi.ribe...@gmail.comescreveu: Olá a todos, corte CREATE TRIGGER trg_t_incendio BEFORE INSERT OR UPDATE ON t_incendio FOR EACH ROW EXECUTE PROCEDURE fun_teste(); corte Creio que o seu erro está em criar a trigger com o BEFORE, no seu caso teria que ser AFTER, pois está sendo feito select em uma tabela que não foi inserido dados ainda. Altere a trigger para AFTER e veja o resultado. Att. Danilo ___ 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] Trigger não dispara
Era isso, faltava o DELETE no CREATE TRIGGER, pondo assim: CREATE TRIGGER trg_t_incendio AFTER INSERT OR UPDATE OR DELETE ON t_incendio FOR EACH ROW EXECUTE PROCEDURE fun_teste(); Já dispara nas três acções (INSERT, UPDATE e DELETE). Adicionei esta parte à função para contemplar um UPDATE: ELSIF (TG_OP = 'UPDATE') THEN DELETE FROM t_relatorio WHERE codigo = OLD.codigo; INSERT INTO t_relatorio(codigo,tipo,nome) (SELECT i.codigo, a.tipo, a.nome FROM t_incendio AS i, t_areaprotegida AS a WHERE (i.geom a.geom) AND ST_Intersects(i.geom,a.geom) GROUP BY i.codigo, a.tipo, a.nome HAVING i.codigo = NEW.codigo); Perfeito, obrigado pela vossa grande ajuda! Att, Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 26 de Março de 2012 17:42, Danilo Silva danilo.dsg.go...@gmail.comescreveu: A sua trigger somente é executa com ocorre insert ou update, do jeito que está nunca será executada para delete. Crie outra trigger para o evento de delete. Att. Danilo Em 26 de março de 2012 11:00, Eloi Ribeiro eloi.ribe...@gmail.comescreveu: No INSERT a função dispara correctamente mas no DELETE já não, alguma razão para isso? DELETE FROM t_incendio WHERE codigo=99; SELECT * FROM t_incendio; --nada, ok SELECT * FROM t_relatorio; 1;99;P. Natural;Bosque - o 'trigger' não disparou para eliminar o registo? Att, Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função
Obrigado a todos pelas vossas dicas. Fiz isso, retirei a parte de criação de colunas da função e agora não salta nenhum erro. No entanto seria de esperar que quando um polígono fosse editado o campo área fosse actualizado e isso não acontece. Alguém me sabe dizer o que é que está mal? CREATE OR REPLACE FUNCTION fun_dimensoes() RETURNS trigger AS $BODY$ DECLARE tipovarchar(20); sridinteger; BEGIN tipo :=(SELECT type FROM geometry_columns WHERE f_table_schema = TG_TABLE_SCHEMA AND f_table_name = TG_TABLE_NAME); srid :=(SELECT srid FROM geometry_columns WHERE f_table_schema = TG_TABLE_SCHEMA AND f_table_name = TG_TABLE_NAME); -- ponto IF (tipo = 'POINT' OR tipo = 'MULTIPOINT') THEN NEW.x = ST_X(NEW.geom); NEW.y = ST_Y(NEW.geom); -- linha ELSIF (tipo = 'LINESTRING' OR tipo = 'MULTILINESTRING') THEN IF (srid = 23030 OR srid = 25830) THEN NEW.longitude = ST_Length(NEW.geom)::bigint; ELSIF (srid = 4326) THEN NEW.longitude = ST_Length(Geography(NEW.geom))::bigint; END IF; -- poligono ELSIF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN IF (srid = 23030 OR srid = 25830) THEN NEW.area = ST_Area(NEW.geom)::bigint; NEW.perimetro = ST_Perimeter(NEW.geom)::bigint; ELSIF (srid = 4326) THEN NEW.area = ST_Area(Geography(NEW.geom))::bigint; NEW.perimetro = ST_Length(Geography(NEW.geom))::bigint; END IF; END IF; RETURN NEW; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; Obrigado, Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 17 de Março de 2012 21:39, Matheus de Oliveira matioli.math...@gmail.com escreveu: Se você passar a trigger para AFTER ao invés de BEFORE suas chances de não ter lock aumentam, mas não desaparecem. Analisando por cima suas necessidades, não acredito que a melhor solução seja realmente adicionar uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou seja, sempre adicione a coluna (talvez junto com a execução do comando CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode até fazer a verificação e dar um RAISE EXCEPTION caso não exista). PS: Caso a trigger seja genérica para várias tabelas, você pode pensar em usar herança nessas tabelas para organizar melhor as coisas. Atenciosamente, -- Matheus de Oliveira Bacharelado em Ciências de Computação Laboratório de Computação de Alto Desempenho - LCADhttp://www.lcad.icmc.usp.br/ Instituto de Ciências Matemáticas e de Computação - ICMChttp://www.icmc.usp.br/ Universidade de São Paulo - USP http://www.sc.usp.br/ On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro eloi.ribe...@gmail.comwrote: O melhor será separar esta função em duas: A primeira que verifique se os campos existem e se não os criam. E a segunda como disparador para que se actualizem com os inserts e updates. Obrigado pela ajuda! Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel fha...@gmail.com escreveu: Cancelando as demais transações/conexões também resolve seu problema *se, e somente se* isto não for um problema no seu cenário. Minha experiência com DDL dentro de funções é de resultado sempre inesperado. Se a função é específica para ser executada em horário controlado, geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor executando funções do que comandos mais complexos ou scripts. Já se a função é para ser chamada automaticamente por causa de uma necessidade de uma aplicação ou usuário, a chance de lock é monstruosa, e é o que está ocorrendo com o colega. []s Flavio Gurgel ___ 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 ___ 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] Ajuda com função - adicionar campo dentro de uma função
Sim, não está bem assim? CREATE TRIGGER trg_postfire_study_area_UPDATE_dimensoes BEFORE INSERT OR UPDATE ON sch_forestal.postfire_study_area FOR EACH ROW EXECUTE PROCEDURE fun_dimensoes(); Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 20 de Março de 2012 15:09, Matheus de Oliveira matioli.math...@gmail.com escreveu: A trigger é BEFORE? Caso contrário não atualiza mesmo. -- Matheus de Oliveira Bacharelado em Ciências de Computação Laboratório de Computação de Alto Desempenho - LCADhttp://www.lcad.icmc.usp.br/ Instituto de Ciências Matemáticas e de Computação - ICMChttp://www.icmc.usp.br/ Universidade de São Paulo - USP http://www.sc.usp.br/ On Tue, Mar 20, 2012 at 10:57 AM, Eloi Ribeiro eloi.ribe...@gmail.comwrote: Obrigado a todos pelas vossas dicas. Fiz isso, retirei a parte de criação de colunas da função e agora não salta nenhum erro. No entanto seria de esperar que quando um polígono fosse editado o campo área fosse actualizado e isso não acontece. Alguém me sabe dizer o que é que está mal? CREATE OR REPLACE FUNCTION fun_dimensoes() RETURNS trigger AS $BODY$ DECLARE tipovarchar(20); sridinteger; BEGIN tipo :=(SELECT type FROM geometry_columns WHERE f_table_schema = TG_TABLE_SCHEMA AND f_table_name = TG_TABLE_NAME); srid :=(SELECT srid FROM geometry_columns WHERE f_table_schema = TG_TABLE_SCHEMA AND f_table_name = TG_TABLE_NAME); -- ponto IF (tipo = 'POINT' OR tipo = 'MULTIPOINT') THEN NEW.x = ST_X(NEW.geom); NEW.y = ST_Y(NEW.geom); -- linha ELSIF (tipo = 'LINESTRING' OR tipo = 'MULTILINESTRING') THEN IF (srid = 23030 OR srid = 25830) THEN NEW.longitude = ST_Length(NEW.geom)::bigint; ELSIF (srid = 4326) THEN NEW.longitude = ST_Length(Geography(NEW.geom))::bigint; END IF; -- poligono ELSIF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN IF (srid = 23030 OR srid = 25830) THEN NEW.area = ST_Area(NEW.geom)::bigint; NEW.perimetro = ST_Perimeter(NEW.geom)::bigint; ELSIF (srid = 4326) THEN NEW.area = ST_Area(Geography(NEW.geom))::bigint; NEW.perimetro = ST_Length(Geography(NEW.geom))::bigint; END IF; END IF; RETURN NEW; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; Obrigado, Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 17 de Março de 2012 21:39, Matheus de Oliveira matioli.math...@gmail.com escreveu: Se você passar a trigger para AFTER ao invés de BEFORE suas chances de não ter lock aumentam, mas não desaparecem. Analisando por cima suas necessidades, não acredito que a melhor solução seja realmente adicionar uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou seja, sempre adicione a coluna (talvez junto com a execução do comando CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode até fazer a verificação e dar um RAISE EXCEPTION caso não exista). PS: Caso a trigger seja genérica para várias tabelas, você pode pensar em usar herança nessas tabelas para organizar melhor as coisas. Atenciosamente, -- Matheus de Oliveira Bacharelado em Ciências de Computação Laboratório de Computação de Alto Desempenho - LCADhttp://www.lcad.icmc.usp.br/ Instituto de Ciências Matemáticas e de Computação - ICMChttp://www.icmc.usp.br/ Universidade de São Paulo - USP http://www.sc.usp.br/ On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro eloi.ribe...@gmail.comwrote: O melhor será separar esta função em duas: A primeira que verifique se os campos existem e se não os criam. E a segunda como disparador para que se actualizem com os inserts e updates. Obrigado pela ajuda! Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel fha...@gmail.com escreveu: Cancelando as demais transações/conexões também resolve seu problema *se, e somente se* isto não for um problema no seu cenário. Minha experiência com DDL dentro de funções é de resultado sempre inesperado. Se a função é específica para ser executada em horário controlado, geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor executando funções do que comandos mais complexos ou scripts. Já se a função é para ser chamada automaticamente por causa de uma necessidade de uma aplicação ou usuário, a chance de lock é monstruosa, e é o que está ocorrendo com o colega. []s Flavio Gurgel ___ 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
Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função
O melhor será separar esta função em duas: A primeira que verifique se os campos existem e se não os criam. E a segunda como disparador para que se actualizem com os inserts e updates. Obrigado pela ajuda! Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel fha...@gmail.com escreveu: Cancelando as demais transações/conexões também resolve seu problema *se, e somente se* isto não for um problema no seu cenário. Minha experiência com DDL dentro de funções é de resultado sempre inesperado. Se a função é específica para ser executada em horário controlado, geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor executando funções do que comandos mais complexos ou scripts. Já se a função é para ser chamada automaticamente por causa de uma necessidade de uma aplicação ou usuário, a chance de lock é monstruosa, e é o que está ocorrendo com o colega. []s Flavio Gurgel ___ 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] Ajuda com função - adicionar campo dentro de uma função
Antes de nada obrigada pela vossas respostas. Efectivamente, Flavio, o esquema tg_table_schema não existe. Só depois buscando um pouco mais encontrei que tinha de por a sentencia SQL ALTER TABLE assim: EXECUTE 'ALTER TABLE ' || quote_ident(esquema) || '.' || quote_ident(tabela) || ' ADD COLUMN area bigint'; E de esta maneira já reconhecia o esquema e nome da tabela. Tiago, com EXECUTE IMMEDIATE da-me um erro de sintasis: EXECUTE IMMEDIATE 'ALTER TABLE ' || quote_ident(esquema) || '.' || quote_ident(tabela) || ' ADD COLUMN area bigint'; ERROR: error de sintaxis en o cerca de «IMMEDIATE» OK, agora sem o 'IMMEDIATE' a função é criada com êxito mas quando se executa salta o seguinte erro: ERROR: no se puede hacer ALTER TABLE en «postfire_study_area» porque está siendo usada por consultas activas en esta sesión CONTEXTO: sentencia SQL: «ALTER TABLE sch_forestal.postfire_study_ area ADD COLUMN area bigint» Claro a função dispara quando faço um update ou insert na tabela e tem de calcular a 'area' e o 'perimetro' para os registos afectados. Mas se estes campos não existem deveriam ser criados e depois actualizados. O problema parece ser que não se pode criar os campos tendo a tabela um insert ou update em curso. Isto é mesmo assim ou existe uma maneira de contornar este problema? Obrigado! Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro No dia 15 de Março de 2012 00:49, Tiago Adami adam...@gmail.com escreveu: Em 12 de março de 2012 07:11, Eloi Ribeiro eloi.ribe...@gmail.com escreveu: Ola a todos, Estou a fazer a seguinte função para que me actualize o campo 'area' cada vez que exista um INSERT ou UPDATE numa tabela. O problema está que o campo 'area' pode não existir e gostava que nesse caso o campo seja criado e preenchido para todos os registos. Como tenho salta-me o erro de que 'Nao existe o esquema «tg_table_schema»' e não encontro maneira de resolver isso. Como faço para adicionar um campo à tabela onde dispara a função e se preencha esse campo? Se bem entendi, queres adicionar uma coluna à tabela quando ela não existir. Já tentou mudar o seu ALTER TABLE explícito por: EXECUTE IMMEDIATE 'ALTER TABLE TG_TABLE_SCHEMA.TG_TABLE_NAME ADD COLUMN area bigint'; ? -- TIAGO J. ADAMI http://www.adamiworks.com ___ 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
[pgbr-geral] Ajuda com função - adicionar campo dentro de uma função
Ola a todos, Estou a fazer a seguinte função para que me actualize o campo 'area' cada vez que exista um INSERT ou UPDATE numa tabela. O problema está que o campo 'area' pode não existir e gostava que nesse caso o campo seja criado e preenchido para todos os registos. Como tenho salta-me o erro de que 'Nao existe o esquema «tg_table_schema»' e não encontro maneira de resolver isso. Como faço para adicionar um campo à tabela onde dispara a função e se preencha esse campo? Sugestões são bem vindas. Obrigado de ante-mão. CREATE OR REPLACE FUNCTION fun_dimensoes() RETURNS trigger AS $BODY$ DECLARE tipovarchar(20); sridinteger; BEGIN tipo = (SELECT type FROM geometry_columns WHERE f_table_schema = TG_TABLE_SCHEMA AND f_table_name = TG_TABLE_NAME); srid = (SELECT srid FROM geometry_columns WHERE f_table_schema = TG_TABLE_SCHEMA AND f_table_name = TG_TABLE_NAME); IF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN IF NOT EXISTS(SELECT column_name FROM information_schema.columns WHERE table_schema = TG_TABLE_SCHEMA AND table_name = TG_TABLE_NAME AND column_name='area') THEN *ALTER TABLE TG_TABLE_SCHEMA.TG_TABLE_NAME ADD COLUMN area bigint;* IF (srid = 23030 OR srid = 25830) THEN *UPDATE TG_TABLE_SCHEMA.TG_TABLE_NAME SET area = ST_Area(geom)::bigint;* ELSIF (srid = 4326) THEN *UPDATE TG_TABLE_SCHEMA.TG_TABLE_NAME SET area = ST_Area(Geography(geom))::bigint;* END IF; ELSE IF (srid = 23030 OR srid = 25830) THEN NEW.area = ST_Area(NEW.geom)::bigint; ELSIF (srid = 4326) THEN NEW.area = ST_Area(Geography(NEW.geom))::bigint; END IF; END IF; END IF; RETURN NEW; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; CREATE TRIGGER trg_postfire_study_area_UPDATE_dimensoes BEFORE INSERT OR UPDATE ON sch_forestal.postfire_study_area FOR EACH ROW EXECUTE PROCEDURE fun_dimensoes(); Quando edito a geometria salta o seguinte erro: ERROR: no existe el esquema «tg_table_schema» CONTEXTO: sentencia SQL: «ALTER TABLE TG_TABLE_SCHEMA.TG_TABLE_NAME ADD COLUMN area bigint» Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Ajuda com função - adicionar campo dentro de uma função
Bem, já consegui alguns progressos com a função. No entanto tenho o seguinte erro: ERROR: no se puede hacer ALTER TABLE en «postfire_study_area» porque está siendo usada por consultas activas en esta sesión CONTEXTO: sentencia SQL: «ALTER TABLE sch_forestal.postfire_study_area ADD COLUMN area bigint» Fiz as seguintes alterações: CREATE OR REPLACE FUNCTION fun_dimensoes() RETURNS trigger AS $BODY$ DECLARE esquemavarchar(20); tabelavarchar(50); tipovarchar(20); sridinteger; BEGIN esquema := TG_TABLE_SCHEMA; tabela:= TG_TABLE_NAME; tipo := (SELECT type FROM geometry_columns WHERE f_table_schema = TG_TABLE_SCHEMA AND f_table_name = TG_TABLE_NAME); srid := (SELECT srid FROM geometry_columns WHERE f_table_schema = TG_TABLE_SCHEMA AND f_table_name = TG_TABLE_NAME); IF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN IF NOT EXISTS(SELECT column_name FROM information_schema.columns WHERE table_schema = TG_TABLE_SCHEMA AND table_name = TG_TABLE_NAME AND column_name='area') THEN EXECUTE 'ALTER TABLE ' || quote_ident(esquema) || '.' || quote_ident(tabela) || ' ADD COLUMN area bigint'; IF (srid = 23030 OR srid = 25830) THEN EXECUTE 'UPDATE ' || quote_ident(esquema) || '.' || quote_ident(tabela) || ' SET area = ST_Area(geom)::bigint'; ELSIF (srid = 4326) THEN EXECUTE 'UPDATE ' || quote_ident(esquema) || '.' || quote_ident(tabela) || ' SET area = ST_Area(Geography(geom))::bigint'; END IF; ELSE IF (srid = 23030 OR srid = 25830) THEN NEW.area = ST_Area(NEW.geom)::bigint; ELSIF (srid = 4326) THEN NEW.area = ST_Area(Geography(NEW.geom))::bigint; END IF; END IF; END IF; RETURN NEW; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100; CREATE TRIGGER trg_postfire_study_area_UPDATE_dimensoes BEFORE INSERT OR UPDATE ON sch_forestal.postfire_study_area FOR EACH ROW EXECUTE PROCEDURE fun_dimensoes(); ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Limites e performance do Postgres com Postgis
Nestes links estão algumas sugestões de configuração de PostgreSQL para servir dados espaciais: http://workshops.opengeo.org/postgis-intro/tuning.html http://wiki.openstreetmap.org/wiki/Mapnik/PostGIS#Tuning_the_database Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] tabela de pontos com geometria
Pessoal alguém pode dizer-me como crio uma tabela de pontos no postgresql? Só olhar na seção de tipos de dados no manual… não tem segredo algum. Se quiser usar isso para geoprocessamento, já é indicado olhar o PostGIS. Tenho uma entrada no meu blog de como fazer isso com PostGIS. Boa sorte, Eloi Ribeiro GIS Analyst 39,45º -0,40º flavors.me/eloiribeiro ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] [ajuda] localização fisica do banco de dados no ubuntu
No ubuntu 10.04 a o directorio de cluster esta em /var/lib/postgresql/8.4/main/base Eloi Ribeiro GIS Analyst 39,45º -0,40º http://eloiribeiro.wordpress.com No dia 3 de Setembro de 2011 00:14, Marco Antônio Sari marcoantonios...@gmail.com escreveu: 1- voce quer saber o diretorio da aplicacao PostgreSQL ou o diretorio do CLUSTER ? 2- Qual o SO ? abç 2011/9/2 rogerio dandrea rolemo...@gmail.com Duvida pra lá de basica, mas não encontrei, onde fica o banco de dados no ubuntu? procuro pelo nome do banco.db ? ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- Marco Antônio Sari ___ 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
[pgbr-geral] passar tabelas de um esquema para outro
Olá à lista, Tive a necessidade de mover umas tabelas (60 aprox.) de um esquema para outro e fiz da maneira que detalho mais a baixo. No entanto, sendo um novato nestas andanças, não estou seguro que seja um procedimento correto e gostaria saber se acarreta algumas implicações negativas para o desempenho da base de dados. Estes foram os passos dados: # dump /usr/bin/pg_dump --host localhost --port 5432 --username utilizador --format plain --column-inserts --no-owner --verbose --file /home/user/ficheiro.sql --schema 'sch_origem' bd_nome # mudar o nome do esquema de origem pelo de destino sed 's/sch_origem/sch_destino/g' ficheiro.sqlficheiro2.sql # subir as tabelas ao novo esquema psql -h localhost -U utilizador -d bd_nome -f ficheiro2.sql O que posso dizer é que por agora funciona tudo bem. Obrigado, Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] passar tabelas de um esquema para outro
2011/5/4 Fabrízio de Royes Mello fabriziome...@gmail.com Se vc realmente deseja *mover* as tabelas vc poderia simplificar da seguinte forma: psql -h localhost -U utilizador bd_nome -A -t -c select 'ALTER TABLE '||quote_ident(table_schema)||'.'||quote_ident(table_name)||' SET SCHEMA '||quote_ident('sch_origem')||';' from information_schema.tables where table_schema = 'sch_destino' | psql -h localhost -U utilizador bd_nome Assim elimina a necessidade de dump/restore. Obs: Da forma como vc apresentou vc está copiando o conteúdo de um schema para outro... se nao apagar o sch_origem da base vc terá ao final os dois. Uahu! Excelente dica Fabrízio. Tomo nota. Tens razao, fiquei com as dados duplicados, pelo menos até estar seguro que estaria tudo bem no novo esquema. Obrigado. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] passar tabelas de um esquema para outro
2011/5/4 Joao Cosme de Oliveira Junior joao.co...@serpro.gov.br mas e uma opcao, se vc tiver um schema vendas clientes... ai lascou mas se tiver algum padrao tranquilo OK, neste caso o nome do esquema nao é comum. Tomo nota da advertencia, nao me tinha dado conta desse perigo. 2011/5/4 Euler Taveira de Oliveira eu...@timbira.com A melhor solução é ALTER TABLE foo SET SCHEMA bar. Soluções com sed podem fazer alterações indesejadas (comandos, nome de tabelas, nome de colunas e dados do cliente). Basta executar essa sentencia SQL para cada uma das tabelas? *ALTER TABLE esquema_origem.tabela1 SET SCHEMA esquema_destino;* Obrigado por todo o aportado! ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] passar tabelas de um esquema para outro
2011/5/4 JotaComm jota.c...@gmail.com Sim, Porém, assim você para uma única tabela. Eu mostrei nesta thread como fazer para mais de uma tabela ao mesmo tempo. OK, cool! ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] função: como criar series sem que se multipliquem
2011/4/6 Luiz Matsumura luiz.matsum...@gmail.com Já que está usando pl/pgsql por que não fazer um loop FOR ? algo como FOR i IN 1..100 LOOP INSERT INTO sch_ambiente.escv_incendios_puntos_muestreo( poi_code, fir_code, fir_name, geom) VALUES ( i , new.fir_code , new.fir_name , (select ) ); END LOOP; Em 5 de abril de 2011 05:40, Eloi Ribeiro eloi.ribe...@gmail.com escreveu: Ola à lista, Tenho o seguinte disparador para quando faço um INSERT de um novo registo (polígono incêndio florestal) me crie 100 pontos regulares noutra tabela. A dificuldade que encontro é em numerar esses pontos de 1 a 100, porque cada vez que tento meter um generate_series(1,100) multiplica-me os 100 pontos pela serie (de 1 a 100) e fico com 1 pontos. Entendo que esse seja o resultado lógico, embora não o desejado. Alguém tem uma sugestão para que isto não ocorra? --DROP TRIGGER trg_escv_incendios_todos_subtablas ON sch_ambiente.escv_incendios_todos; --DROP FUNCTION sch_ambiente.trg_escv_incendios_todos_subtablas(); CREATE OR REPLACE FUNCTION sch_ambiente.trg_escv_incendios_todos_subtablas() RETURNS trigger AS $BODY$ BEGIN IF (TG_OP = 'DELETE') THEN DELETE FROM sch_ambiente.escv_incendios_puntos_muestreo WHERE fir_code = OLD.fir_code; ELSIF (TG_OP = 'UPDATE') OR (TG_OP = 'INSERT') THEN -- elimina anteriores para evitar repetidos DELETE FROM sch_ambiente.escv_incendios_puntos_muestreo WHERE fir_code = NEW.fir_code; -- Puntos de muestreo INSERT INTO sch_ambiente.escv_incendios_puntos_muestreo( -- poi_code - CAMPO SERIE DE 1 A 100 fir_code, fir_name, geom) (SELECT -- generate_series(1,100) - SERIE DE 1 A 100 NEW.fir_code, NEW.fir_name, t1.geom FROM (SELECT tx.fir_code, ST_Setsrid(ST_MakePoint(tx.x, ty.y), 23030) AS geom FROM (SELECT NEW.fir_code AS fir_code, generate_series( (SELECT cast(ST_XMin(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)+((SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)/2), (SELECT cast(ST_XMax(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code), (SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)) AS x) AS tx JOIN (SELECT NEW.fir_code AS fir_code, generate_series( (SELECT cast(ST_YMin(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)+((SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)/2), (SELECT cast(ST_YMax(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code), (SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)) AS y) AS ty ON tx.fir_code = ty.fir_code) AS t1, sch_ambiente.escv_incendios_todos AS t2 WHERE t2.fir_code = NEW.fir_code AND (t1.geom t2.geom_23030) AND ST_Intersects(t1.geom, t2.geom_23030)) LIMIT 100; END IF; RETURN NULL; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER trg_escv_incendios_todos_subtablas AFTER INSERT OR UPDATE OR DELETE ON sch_ambiente.escv_incendios_todos FOR EACH ROW EXECUTE PROCEDURE sch_ambiente.trg_escv_incendios_todos_subtablas(); Obrigado, Eloi Ribeiro Obrigado Luiz, tentarei a abordagem sugerida. Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] função: como criar series sem que se multipliquem
Ola à lista, Tenho o seguinte disparador para quando faço um INSERT de um novo registo (polígono incêndio florestal) me crie 100 pontos regulares noutra tabela. A dificuldade que encontro é em numerar esses pontos de 1 a 100, porque cada vez que tento meter um generate_series(1,100) multiplica-me os 100 pontos pela serie (de 1 a 100) e fico com 1 pontos. Entendo que esse seja o resultado lógico, embora não o desejado. Alguém tem uma sugestão para que isto não ocorra? --DROP TRIGGER trg_escv_incendios_todos_subtablas ON sch_ambiente.escv_incendios_todos; --DROP FUNCTION sch_ambiente.trg_escv_incendios_todos_subtablas(); CREATE OR REPLACE FUNCTION sch_ambiente.trg_escv_incendios_todos_subtablas() RETURNS trigger AS $BODY$ BEGIN IF (TG_OP = 'DELETE') THEN DELETE FROM sch_ambiente.escv_incendios_puntos_muestreo WHERE fir_code = OLD.fir_code; ELSIF (TG_OP = 'UPDATE') OR (TG_OP = 'INSERT') THEN -- elimina anteriores para evitar repetidos DELETE FROM sch_ambiente.escv_incendios_puntos_muestreo WHERE fir_code = NEW.fir_code; -- Puntos de muestreo INSERT INTO sch_ambiente.escv_incendios_puntos_muestreo( -- poi_code - CAMPO SERIE DE 1 A 100 fir_code, fir_name, geom) (SELECT -- generate_series(1,100) - SERIE DE 1 A 100 NEW.fir_code, NEW.fir_name, t1.geom FROM (SELECT tx.fir_code, ST_Setsrid(ST_MakePoint(tx.x, ty.y), 23030) AS geom FROM (SELECT NEW.fir_code AS fir_code, generate_series( (SELECT cast(ST_XMin(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)+((SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)/2), (SELECT cast(ST_XMax(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code), (SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)) AS x) AS tx JOIN (SELECT NEW.fir_code AS fir_code, generate_series( (SELECT cast(ST_YMin(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)+((SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)/2), (SELECT cast(ST_YMax(ST_Envelope(geom_23030)) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code), (SELECT cast(sqrt(ST_Area(geom_23030)/100) AS int) FROM sch_ambiente.escv_incendios_todos WHERE fir_code=NEW.fir_code)) AS y) AS ty ON tx.fir_code = ty.fir_code) AS t1, sch_ambiente.escv_incendios_todos AS t2 WHERE t2.fir_code = NEW.fir_code AND (t1.geom t2.geom_23030) AND ST_Intersects(t1.geom, t2.geom_23030)) LIMIT 100; END IF; RETURN NULL; END; $BODY$ LANGUAGE plpgsql; CREATE TRIGGER trg_escv_incendios_todos_subtablas AFTER INSERT OR UPDATE OR DELETE ON sch_ambiente.escv_incendios_todos FOR EACH ROW EXECUTE PROCEDURE sch_ambiente.trg_escv_incendios_todos_subtablas(); Obrigado, Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] duvida com disparador: eliminar registos desactualizados.
Ola a toda a lista, Tenho uma tabela de *incendios* (com geometria de polígonos) onde se encontram os perímetros de incêndios florestais. Outra *admin* (com geometria de polígonos) com as divisões administrativas. E uma terceira *resumo* (alfanumérica) onde quero que o seguinte disparador guarde a superfície afectada por incêndio e município. Até aqui tudo bem, o problema vem quando faça um UPDATE de um determinado incêndio, alterando a sua geometria/superfície, o disparador deve eliminar previamente os registos originados pelo INSERT e recalcular a superfície afectada por incêndio e município. Não sei como eliminar os registos desactualizados baseando-me no codigo de incendio (fire_code). - -- tabela incendios CREATE TABLE sch_temp.incendios (gid SERIAL PRIMARY KEY, fir_code BIGINT); SELECT AddGeometrycolumn ('sch_temp','incendios','geom',23030,'POLYGON',2); -- tabela municipios CREATE TABLE sch_temp.municipios (adm_code INT, adm_name VARCHAR(50)); SELECT AddGeometrycolumn ('sch_temp','municipios','geom',23030,'POLYGON',2); INSERT INTO sch_temp.municipios(adm_code,adm_name, geom) VALUES(101,'Muni a', ST_GeomFromText('SRID=23030;POLYGON((725000 443,73 443,73 4425000,725000 443))')); INSERT INTO sch_temp.municipios(adm_code,adm_name, geom) VALUES(102,'Muni b', ST_GeomFromText('SRID=23030;POLYGON((725000 443,73 4425000,725000 4425000,725000 443))')); -- tabela resumo CREATE TABLE sch_temp.resumo (id SERIAL PRIMARY KEY, fir_code BIGINT, adm_code INT, adm_area BIGINT); -- disparador CREATE OR REPLACE FUNCTION funcao_incendios() RETURNS trigger AS $fire_by_admin$ DECLARE fire BIGINT; BEGIN --fire = NEW.fire_code; -- -- RAIZ DO PROBLEMA IF (TG_OP = 'DELETE') THEN DELETE FROM sch_temp.resumo WHERE fir_code = fire; ELSIF (TG_OP = 'UPDATE') OR (TG_OP = 'INSERT') THEN --DELETE FROM sch_temp.resumo --WHERE fir_code = fire; INSERT INTO sch_temp.resumo(fir_code, adm_code, adm_area) ( SELECT t2.fir_code, t1.adm_code, sum(ST_Area(ST_Intersection(t1.geom,t2.geom))) FROM sch_temp.municipios AS t1, sch_temp.incendios AS t2 WHERE (t1.geom t2.geom) AND ST_Intersects(t1.geom,t2.geom) GROUP BY t2.fir_code, t1.adm_code); END IF; RETURN NULL; END; $fire_by_admin$ LANGUAGE plpgsql; CREATE TRIGGER funcao_incendios AFTER INSERT OR UPDATE OR DELETE ON sch_temp.incendios FOR EACH ROW EXECUTE PROCEDURE funcao_incendios(); -- insert INSERT INTO sch_temp.incendios(fir_code, geom) VALUES(1, ST_GeomFromText('SRID=23030;POLYGON((726000 4429000,729000 4429000,729000 4426000,726000 4426000,726000 4429000))')); SELECT * FROM sch_temp.resumo; -- resultado observado e esperado /*fir_code,adm_code,adm_area 1;1;101;450 2;1;102;450*/ -- update UPDATE sch_temp.incendios SET geom = ST_GeomFromText('SRID=23030;POLYGON((727000 4429000,729100 4429000,729100 4427000,727000 4429000))') WHERE gid = 1; SELECT * FROM sch_temp.resumo; -- resultado observado /*fir_code,adm_code,adm_area 1;1;101;450 - este registe devia ser eliminado, vem do INSERT 2;1;102;450 - este registe devia ser eliminado, vem do INSERT 3;1;101;210*/ -- resultado esperado /*fir_code,adm_code,adm_area 3;1;101;210*/ -- eliminar todo o anterior /*DROP TRIGGER IF EXISTS funcao_incendios ON sch_temp.incendios; SELECT DropGeometryColumn('sch_temp','incendios','geom'); SELECT DropGeometryColumn('sch_temp','municipios','geom'); DROP TABLE sch_temp.resumo; DROP TABLE sch_temp.municipios; DROP TABLE sch_temp.incendios;*/ - Obrigado, Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] duvida com disparador: eliminar registos desactualizados.
On Fri, Mar 25, 2011 at 13:57, Osvaldo Kussama osvaldo.kuss...@gmail.comwrote: 2011/3/25, Eloi Ribeiro eloi.ribe...@gmail.com: Ola a toda a lista, Tenho uma tabela de *incendios* (com geometria de polígonos) onde se encontram os perímetros de incêndios florestais. Outra *admin* (com geometria de polígonos) com as divisões administrativas. E uma terceira *resumo* (alfanumérica) onde quero que o seguinte disparador guarde a superfície afectada por incêndio e município. Até aqui tudo bem, o problema vem quando faça um UPDATE de um determinado incêndio, alterando a sua geometria/superfície, o disparador deve eliminar previamente os registos originados pelo INSERT e recalcular a superfície afectada por incêndio e município. Não sei como eliminar os registos desactualizados baseando-me no codigo de incendio (fire_code). - -- tabela incendios CREATE TABLE sch_temp.incendios (gid SERIAL PRIMARY KEY, fir_code BIGINT); SELECT AddGeometrycolumn ('sch_temp','incendios','geom',23030,'POLYGON',2); -- tabela municipios CREATE TABLE sch_temp.municipios (adm_code INT, adm_name VARCHAR(50)); SELECT AddGeometrycolumn ('sch_temp','municipios','geom',23030,'POLYGON',2); INSERT INTO sch_temp.municipios(adm_code,adm_name, geom) VALUES(101,'Muni a', ST_GeomFromText('SRID=23030;POLYGON((725000 443,73 443,73 4425000,725000 443))')); INSERT INTO sch_temp.municipios(adm_code,adm_name, geom) VALUES(102,'Muni b', ST_GeomFromText('SRID=23030;POLYGON((725000 443,73 4425000,725000 4425000,725000 443))')); -- tabela resumo CREATE TABLE sch_temp.resumo (id SERIAL PRIMARY KEY, fir_code BIGINT, adm_code INT, adm_area BIGINT); -- disparador CREATE OR REPLACE FUNCTION funcao_incendios() RETURNS trigger AS $fire_by_admin$ DECLARE fire BIGINT; BEGIN --fire = NEW.fire_code; -- -- RAIZ DO PROBLEMA IF (TG_OP = 'DELETE') THEN DELETE FROM sch_temp.resumo WHERE fir_code = fire; ELSIF (TG_OP = 'UPDATE') OR (TG_OP = 'INSERT') THEN --DELETE FROM sch_temp.resumo --WHERE fir_code = fire; INSERT INTO sch_temp.resumo(fir_code, adm_code, adm_area) ( SELECT t2.fir_code, t1.adm_code, sum(ST_Area(ST_Intersection(t1.geom,t2.geom))) FROM sch_temp.municipios AS t1, sch_temp.incendios AS t2 WHERE (t1.geom t2.geom) AND ST_Intersects(t1.geom,t2.geom) GROUP BY t2.fir_code, t1.adm_code); END IF; RETURN NULL; END; $fire_by_admin$ LANGUAGE plpgsql; CREATE TRIGGER funcao_incendios AFTER INSERT OR UPDATE OR DELETE ON sch_temp.incendios FOR EACH ROW EXECUTE PROCEDURE funcao_incendios(); -- insert INSERT INTO sch_temp.incendios(fir_code, geom) VALUES(1, ST_GeomFromText('SRID=23030;POLYGON((726000 4429000,729000 4429000,729000 4426000,726000 4426000,726000 4429000))')); SELECT * FROM sch_temp.resumo; -- resultado observado e esperado /*fir_code,adm_code,adm_area 1;1;101;450 2;1;102;450*/ -- update UPDATE sch_temp.incendios SET geom = ST_GeomFromText('SRID=23030;POLYGON((727000 4429000,729100 4429000,729100 4427000,727000 4429000))') WHERE gid = 1; SELECT * FROM sch_temp.resumo; -- resultado observado /*fir_code,adm_code,adm_area 1;1;101;450 - este registe devia ser eliminado, vem do INSERT 2;1;102;450 - este registe devia ser eliminado, vem do INSERT 3;1;101;210*/ -- resultado esperado /*fir_code,adm_code,adm_area 3;1;101;210*/ -- eliminar todo o anterior /*DROP TRIGGER IF EXISTS funcao_incendios ON sch_temp.incendios; SELECT DropGeometryColumn('sch_temp','incendios','geom'); SELECT DropGeometryColumn('sch_temp','municipios','geom'); DROP TABLE sch_temp.resumo; DROP TABLE sch_temp.municipios; DROP TABLE sch_temp.incendios;*/ - Não sei se é apenas um erro de digitação mas o campo fire_code em sua tabela incendios. Talvez deva ser fir_cod. Outro detalhe é que no caso da operação DELETE o campo NEW.fir_code contém NULL, para sua função ter sentido você precisa se referir a OLD.fir_code. Osvaldo Sim estava mal, substitui o *fire_code* por *fir_code*. Se ponho assim: ERROR: error de sintaxis en o cerca de «SELECT» *fire = SELECT fir_cod FROM sch_temp.incendios WHERE NEW.geom = OLD.geom;* Desta maneira da-me: ERROR: el registro «old» no ha sido asignado aún *fire = OLD.fir_code;* Não sei como definir o *fir_code* que devem ser eliminados. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] duvida com disparador: eliminar registos desactualizados.
2011/3/25 Osvaldo Kussama osvaldo.kuss...@gmail.com 2011/3/25, Eloi Ribeiro eloi.ribe...@gmail.com: On Fri, Mar 25, 2011 at 13:57, Osvaldo Kussama osvaldo.kuss...@gmail.comwrote: 2011/3/25, Eloi Ribeiro eloi.ribe...@gmail.com: Ola a toda a lista, Tenho uma tabela de *incendios* (com geometria de polígonos) onde se encontram os perímetros de incêndios florestais. Outra *admin* (com geometria de polígonos) com as divisões administrativas. E uma terceira *resumo* (alfanumérica) onde quero que o seguinte disparador guarde a superfície afectada por incêndio e município. Até aqui tudo bem, o problema vem quando faça um UPDATE de um determinado incêndio, alterando a sua geometria/superfície, o disparador deve eliminar previamente os registos originados pelo INSERT e recalcular a superfície afectada por incêndio e município. Não sei como eliminar os registos desactualizados baseando-me no codigo de incendio (fire_code). - -- tabela incendios CREATE TABLE sch_temp.incendios (gid SERIAL PRIMARY KEY, fir_code BIGINT); SELECT AddGeometrycolumn ('sch_temp','incendios','geom',23030,'POLYGON',2); -- tabela municipios CREATE TABLE sch_temp.municipios (adm_code INT, adm_name VARCHAR(50)); SELECT AddGeometrycolumn ('sch_temp','municipios','geom',23030,'POLYGON',2); INSERT INTO sch_temp.municipios(adm_code,adm_name, geom) VALUES(101,'Muni a', ST_GeomFromText('SRID=23030;POLYGON((725000 443,73 443,73 4425000,725000 443))')); INSERT INTO sch_temp.municipios(adm_code,adm_name, geom) VALUES(102,'Muni b', ST_GeomFromText('SRID=23030;POLYGON((725000 443,73 4425000,725000 4425000,725000 443))')); -- tabela resumo CREATE TABLE sch_temp.resumo (id SERIAL PRIMARY KEY, fir_code BIGINT, adm_code INT, adm_area BIGINT); -- disparador CREATE OR REPLACE FUNCTION funcao_incendios() RETURNS trigger AS $fire_by_admin$ DECLARE fire BIGINT; BEGIN --fire = NEW.fire_code; -- -- RAIZ DO PROBLEMA IF (TG_OP = 'DELETE') THEN DELETE FROM sch_temp.resumo WHERE fir_code = fire; ELSIF (TG_OP = 'UPDATE') OR (TG_OP = 'INSERT') THEN --DELETE FROM sch_temp.resumo --WHERE fir_code = fire; INSERT INTO sch_temp.resumo(fir_code, adm_code, adm_area) ( SELECT t2.fir_code, t1.adm_code, sum(ST_Area(ST_Intersection(t1.geom,t2.geom))) FROM sch_temp.municipios AS t1, sch_temp.incendios AS t2 WHERE (t1.geom t2.geom) AND ST_Intersects(t1.geom,t2.geom) GROUP BY t2.fir_code, t1.adm_code); END IF; RETURN NULL; END; $fire_by_admin$ LANGUAGE plpgsql; CREATE TRIGGER funcao_incendios AFTER INSERT OR UPDATE OR DELETE ON sch_temp.incendios FOR EACH ROW EXECUTE PROCEDURE funcao_incendios(); -- insert INSERT INTO sch_temp.incendios(fir_code, geom) VALUES(1, ST_GeomFromText('SRID=23030;POLYGON((726000 4429000,729000 4429000,729000 4426000,726000 4426000,726000 4429000))')); SELECT * FROM sch_temp.resumo; -- resultado observado e esperado /*fir_code,adm_code,adm_area 1;1;101;450 2;1;102;450*/ -- update UPDATE sch_temp.incendios SET geom = ST_GeomFromText('SRID=23030;POLYGON((727000 4429000,729100 4429000,729100 4427000,727000 4429000))') WHERE gid = 1; SELECT * FROM sch_temp.resumo; -- resultado observado /*fir_code,adm_code,adm_area 1;1;101;450 - este registe devia ser eliminado, vem do INSERT 2;1;102;450 - este registe devia ser eliminado, vem do INSERT 3;1;101;210*/ -- resultado esperado /*fir_code,adm_code,adm_area 3;1;101;210*/ -- eliminar todo o anterior /*DROP TRIGGER IF EXISTS funcao_incendios ON sch_temp.incendios; SELECT DropGeometryColumn('sch_temp','incendios','geom'); SELECT DropGeometryColumn('sch_temp','municipios','geom'); DROP TABLE sch_temp.resumo; DROP TABLE sch_temp.municipios; DROP TABLE sch_temp.incendios;*/ - Não sei se é apenas um erro de digitação mas o campo fire_code em sua tabela incendios. Talvez deva ser fir_cod. Outro detalhe é que no caso da operação DELETE o campo NEW.fir_code contém NULL, para sua função ter sentido você precisa se referir a OLD.fir_code. Osvaldo Sim estava mal, substitui o *fire_code* por *fir_code*. Se ponho assim: ERROR: error de sintaxis en o cerca de «SELECT» *fire = SELECT fir_cod FROM sch_temp.incendios WHERE NEW.geom = OLD.geom;* Desta maneira da-me: ERROR: el registro «old» no ha sido asignado aún *fire = OLD.fir_code;* Não sei como definir o *fir_code* que devem ser eliminados. Para a atribuição utilize SELECT INTO. Para o segundo ponto você precisa utilizar NEW ou OLD dependendo da operação (INSERT, UPDATE ou DELETE) sendo realizada. Em minha opinião no lugar da variável local
[pgbr-geral] consulta SQL que devolva uma lista com todos os dias de um determinado mês
Ola a toda a lista, É possível criar uma consulta SQL que devolva uma lista com todos os dias de um determinado mês? De momento apenas consegui chegar até aqui, tendo como exemplo o mês de Fevereiro de 2011: SELECT to_date('2011/02', '/MM'), (date_trunc('MONTH', to_date('2011/02', '/MM')) + INTERVAL '1 MONTH - 1 day')::date; O resultado da anterior consulta é o primeiro e ultimo dia do mês: 2011-02-01;2011-02-28 Resultado pretendido é o seguinte: 2011-02-01 2011-02-02 2011-02-03 (...) 2011-02-26 2011-02-27 2011-02-28 Obrigado, Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] consulta SQL que devolva uma lista com todos os dias de um determinado mês
2011/3/14 Fabrízio de Royes Mello fabriziome...@gmail.com Em 14 de março de 2011 07:13, Eloi Ribeiro eloi.ribe...@gmail.comescreveu: Ola a toda a lista, É possível criar uma consulta SQL que devolva uma lista com todos os dias de um determinado mês? De momento apenas consegui chegar até aqui, tendo como exemplo o mês de Fevereiro de 2011: SELECT to_date('2011/02', '/MM'), (date_trunc('MONTH', to_date('2011/02', '/MM')) + INTERVAL '1 MONTH - 1 day')::date; O resultado da anterior consulta é o primeiro e ultimo dia do mês: 2011-02-01;2011-02-28 Resultado pretendido é o seguinte: 2011-02-01 2011-02-02 2011-02-03 (...) 2011-02-26 2011-02-27 2011-02-28 Veja se isso resolve: select '2011-02-01'::date + dia from generate_series(0, extract( day from (('2011-02-01'::date + '1 month'::interval)::date - 1::integer))::integer - 1) as dia; Cordialmente, -- Fabrízio de Royes Mello Blog sobre TI: http://fabriziomello.blogspot.com Perfil Linkedin: http://br.linkedin.com/in/fabriziomello Muito obrigado Fabrízio, solucionado! Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] consulta SQL que devolva uma lista com todos os dias de um determinado mês
2011/3/14 Emerson Hermann emersonherm...@gmail.com Se ainda servir ... SELECT dia::date FROM ( SELECT (to_date('2011-03','-MM')+s.a*'1 day'::INTERVAL) AS dia FROM generate_series(0, (date_trunc('MONTH', to_date('2011/03', '/MM')) + INTERVAL '1 MONTH - 1 day')::date - to_date('2011/03', '/MM'), 1 ) AS s(a)) x Em 14 de março de 2011 07:36, Fabrízio de Royes Mello fabriziome...@gmail.com escreveu: Em 14 de março de 2011 07:13, Eloi Ribeiro eloi.ribe...@gmail.com escreveu: Ola a toda a lista, É possível criar uma consulta SQL que devolva uma lista com todos os dias de um determinado mês? De momento apenas consegui chegar até aqui, tendo como exemplo o mês de Fevereiro de 2011: SELECT to_date('2011/02', '/MM'), (date_trunc('MONTH', to_date('2011/02', '/MM')) + INTERVAL '1 MONTH - 1 day')::date; O resultado da anterior consulta é o primeiro e ultimo dia do mês: 2011-02-01;2011-02-28 Resultado pretendido é o seguinte: 2011-02-01 2011-02-02 2011-02-03 (...) 2011-02-26 2011-02-27 2011-02-28 Veja se isso resolve: select '2011-02-01'::date + dia from generate_series(0, extract( day from (('2011-02-01'::date + '1 month'::interval)::date - 1::integer))::integer - 1) as dia; Cordialmente, -- Fabrízio de Royes Mello Blog sobre TI: http://fabriziomello.blogspot.com Perfil Linkedin: http://br.linkedin.com/in/fabriziomello ___ 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 Assim fica bastante simples: SELECT * FROM generate_series('2011-02-01'::date,'2011-03-01'::date-1, '1 day'); Obrigado a todos, Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] tratar nulls como zeros
Olá à lista, Como faço para evitar resultados null de esta seleçao: SELECT c0-(c1+c2+c3+c4) FROM t1; c0;c1;c2;c3;c4 07:01:13 06:50:22 07:09:11 07:28:58;00:28:00;;; 11:19:0401:33:00 08:09:24;;;00:27:46; 06:44:13;;03:40:36;; 07:01:47 07:06:07;00:14:00;;; 07:59:49;;;00:30:16; 07:00:38 11:05:59;;;00:35:49; 07:05:39 06:50:45;00:14:00;;; 07:12:36 07:24:36 10:26:16;;;00:32:46; 09:03:10;;;01:50:19; 06:56:40 08:06:59;;;00:24:06; Gostaria que o resultado de 10:00:00-(01:00:00+null+null+null) = 09:00:00 Obrigado, Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] tratar nulls como zeros
Fantastico, era isso mesmo. Obrigado! Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com 2011/3/8 Tiago Adami adam...@gmail.com Em 8 de março de 2011 12:50, Eloi Ribeiro eloi.ribe...@gmail.com escreveu: Olá à lista, Como faço para evitar resultados null de esta seleçao: SELECT c0-(c1+c2+c3+c4) FROM t1; c0;c1;c2;c3;c4 07:01:13 06:50:22 07:09:11 07:28:58;00:28:00;;; 11:19:0401:33:00 08:09:24;;;00:27:46; 06:44:13;;03:40:36;; 07:01:47 07:06:07;00:14:00;;; 07:59:49;;;00:30:16; 07:00:38 11:05:59;;;00:35:49; 07:05:39 06:50:45;00:14:00;;; 07:12:36 07:24:36 10:26:16;;;00:32:46; 09:03:10;;;01:50:19; 06:56:40 08:06:59;;;00:24:06; Gostaria que o resultado de 10:00:00-(01:00:00+null+null+null) = 09:00:00 Obrigado, Primeiro você precisa definir qual o valor irá substituir os nulos. Se for usar a hora zero ( 00:00:00 ), tente a função COALESCE para cada uma das colunas: SELECT COALESCE(c0,'00:00:00')-(COALESCE(c1,'00:00:00')+COALESCE(c2,'00:00:00')+COALESCE(c3,'00:00:00')+COALESCE(c4,'00:00:00')) FROM t1; -- TIAGO J. ADAMI http://www.adamiworks.com ___ 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
[pgbr-geral] consulta de agregaçao (GROUP BY ) e com uma restriçao WHERE?
Ola à lista, Como posso fazer uma consulta de agregação (GROUP BY) e com uma restrição tipo WHERE? Exemplo: SELECT count(x) FROM tabela WHERE count(x)1 GROUP BY x; Obrigado! Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] consulta de agregaçao (GROUP BY ) e com uma restriçao WHERE?
Ok, assim já funciona. SELECT count(x) FROM tabela GROUP BY x HAVING count(x)1; Obrigado Victor! []´s Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com 2010/12/20 Victor Hugo vh.cleme...@gmail.com Neste exemplo que vc passou seria melhor vc utilizar having. SELECT count(x) FROM tabela HAVING count(x)1 GROUP BY x; []´s Victor Hugo Em 20 de dezembro de 2010 11:36, Eloi Ribeiro eloi.ribe...@gmail.comescreveu: Ola à lista, Como posso fazer uma consulta de agregação (GROUP BY) e com uma restrição tipo WHERE? Exemplo: SELECT count(x) FROM tabela WHERE count(x)1 GROUP BY x; Obrigado! Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- []´s Victor Hugo ___ 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] ajuda com disparador
4096946.77669013,678073.796964852 4096949.86875352);LINESTRING(-5 37,-1 37) Cumprimentos, Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] ajuda com disparador
2010/11/16 Osvaldo Kussama osvaldo.kuss...@gmail.com Em 15 de novembro de 2010 14:38, Eloi Ribeiro eloi.ribe...@gmail.com escreveu: Olá à lista, Queria fazer um disparador sobre uma tabela com dois campos do tipo 'Geometry' (geom_23030 e geom_4258) cada um com um sistema de coordenadas diferente. A ideia era que o disparador actualiza-se o segundo campo sempre que houvesse um INSERT ou UPDATE no primeiro campo e assim tivessem sempre a mesma geometria mas cada um dos campos com o seu respectivo sistemas de coordenadas. Devido à minha falta de experiência em plpgsql eu não sei como fazer para que o disparador reconheça qual a geometria mais recente e proceder com a actualização da mais antiga. Como tenho feito, actualiza por ordem de como está indicado no disparador sem ter em conta a antiguidade. Deveria adicionar dois novos campos com Time Stamp de cada uma das geometrias para conseguir o meu objectivo? Estou a usar algumas das funções disponibilizadas pela extensão PostGIS. Isto foi o que consegui fazer: --SELECT DropGeometryColumn('sch_temp','teste','geom_23030'); --SELECT DropGeometryColumn('sch_temp','teste','geom_4258'); --DROP TABLE sch_temp.teste; CREATE TABLE sch_temp.teste (gid serial primary key, longitude double precision); SELECT AddGeometrycolumn ('sch_temp','teste','geom_23030',23030,'LINESTRING',2); SELECT AddGeometrycolumn ('sch_temp','teste','geom_4258',4258,'LINESTRING',2); CREATE OR REPLACE FUNCTION funcao_teste() RETURNS trigger AS $$ BEGIN -- Se o campo geom_4258 tem um novo INSERT ou UPDATE, entao actualiza geom_23030. NEW.geom_23030 = ST_Transform((NEW.geom_4258), 23030); -- Se o campo geom_23030 tem um novo INSERT ou UPDATE, entao actualiza geom_4258. NEW.geom_4258 = ST_Transform((NEW.geom_23030), 4258); -- Calcula/actualiza a longitude da geometria. NEW.longitude = ST_Length(NEW.geom_23030); RETURN NEW; END; $$ LANGUAGE plpgsql; DROP TRIGGER IF EXISTS funcao_teste ON sch_temp.teste; CREATE TRIGGER funcao_teste BEFORE INSERT OR UPDATE ON sch_temp.teste FOR EACH ROW EXECUTE PROCEDURE funcao_teste(); INSERT INTO sch_temp.teste(geom_23030) VALUES(ST_GeomFromText('SRID=23030;LINESTRING(232400 4548000,700882 4548000)')); INSERT INTO sch_temp.teste(geom_4258) VALUES (ST_GeomFromText('SRID=4258;LINESTRING(-6 38,-1 38)')); UPDATE sch_temp.teste SET geom_4258 = ST_GeomFromText('SRID=4258;LINESTRING(-5 37,-1 37)') WHERE gid = 2; SELECT gid, longitude, ST_AsText(geom_23030), ST_AsText(geom_4258) FROM sch_temp.teste; Obrigado. Cumprimentos, Pelo que entendi você deve: - verificar qual é a operação (TG_OP); - se for INSERT, verificar em NEW qual foi a informada e calcular a outra, colocando o resultado em NEW; - se for UPDATE, verificar qual foi alterada e calcular a que não foi alterada, colocando o resultado em NEW; CREATE OR REPLACE FUNCTION funcao_teste() RETURNS trigger AS $$ BEGIN IF (TG_OP = 'INSERT') THEN IF (NEW.geom_4258 IS NOT NULL) THEN -- Se o campo geom_4258 tem um novo INSERT, entao actualiza geom_23030. NEW.geom_23030 = ST_Transform((NEW.geom_4258), 23030); ELSE -- Se o campo geom_23030 tem um novo INSERT, entao actualiza geom_4258. NEW.geom_4258 = ST_Transform((NEW.geom_23030), 4258); END IF; ELSE IF (TG_OP = 'UPDATE') THEN IF (NEW.geom_4258 IS NOT NULL) THEN NEW.geom_23030 = ST_Transform((NEW.geom_4258), 23030); ELSE IF (OLD.geom_23030 IS NOT NULL) THEN NEW.geom_4258 = ST_Transform((NEW.geom_23030), 4258); END IF; END IF; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; ou algo nesta linha. Osvaldo ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral Obrigado Osvaldo, era isso mesmo que queria fazer. Apenas nao funciona o ultimo UPDATE. Simplificando o exemplo anterior: --DROP TABLE sch_temp.teste; CREATE TABLE sch_temp.teste (id serial primary key, x int, x100 int); CREATE OR REPLACE FUNCTION funcao_teste() RETURNS trigger AS $$ BEGIN IF (TG_OP = 'INSERT') THEN IF (NEW.x IS NOT NULL) THEN NEW.x100 = NEW.x*100; ELSE NEW.x = NEW.x100/100; END IF; ELSE IF (TG_OP = 'UPDATE') THEN IF (NEW.x IS NOT NULL) THEN NEW.x100 = NEW.x*100; ELSE IF (OLD.x100 IS NOT NULL) THEN NEW.x = NEW.x/100; END IF; END IF; END IF; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; DROP TRIGGER IF EXISTS funcao_teste ON sch_temp.teste; CREATE TRIGGER funcao_teste BEFORE INSERT OR UPDATE ON sch_temp.teste FOR EACH ROW EXECUTE PROCEDURE
Re: [pgbr-geral] ajuda com disparador
On Tue, Nov 16, 2010 at 19:34, Osvaldo Kussama osvaldo.kuss...@gmail.comwrote: Em 16 de novembro de 2010 14:33, Eloi Ribeiro eloi.ribe...@gmail.com escreveu: Obrigado Osvaldo, era isso mesmo que queria fazer. Apenas nao funciona o ultimo UPDATE. Simplificando o exemplo anterior: --DROP TABLE sch_temp.teste; CREATE TABLE sch_temp.teste (id serial primary key, x int, x100 int); CREATE OR REPLACE FUNCTION funcao_teste() RETURNS trigger AS $$ BEGIN IF (TG_OP = 'INSERT') THEN IF (NEW.x IS NOT NULL) THEN NEW.x100 = NEW.x*100; ELSE NEW.x = NEW.x100/100; END IF; ELSE IF (TG_OP = 'UPDATE') THEN IF (NEW.x IS NOT NULL) THEN NEW.x100 = NEW.x*100; ELSE IF (OLD.x100 IS NOT NULL) THEN NEW.x = NEW.x/100; END IF; END IF; END IF; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; DROP TRIGGER IF EXISTS funcao_teste ON sch_temp.teste; CREATE TRIGGER funcao_teste BEFORE INSERT OR UPDATE ON sch_temp.teste FOR EACH ROW EXECUTE PROCEDURE funcao_teste(); INSERT INTO sch_temp.teste(x) VALUES(1); INSERT INTO sch_temp.teste(x100) VALUES (200); SELECT * FROM sch_temp.teste; 1;1;100 2;2;200 Os INSERTS funcionam na perfeição. UPDATE sch_temp.teste SET x = 3 WHERE x = 2; SELECT * FROM sch_temp.teste; 1;1;100 2;3;300 O primeiro UPDATE também. UPDATE sch_temp.teste SET x100 = 200 WHERE x = 3; SELECT * FROM sch_temp.teste; 1;1;100 2;3;300 Excepto este ultimo que não dispara. Porque? Aqui o resultado deveria ser: 1;1;100 2;2;200 Obrigado por toda a ajuda. Eloi Creio que você precisa rever quais testes devem ser feitos. Talvez: IF (OLD.x100 IS NOT NULL) THEN NEW.x = NEW.x/100; END IF; deva, na realidade ser: IF (NEW.x100 IS NOT NULL) THEN NEW.x = NEW.x/100; END IF; Eu não entendi muito bem se sempre que atualizar uma coordenada a outra deve ser automaticamente modificada ou se isto depende de alguma outra informação ou pré-existência de dados. Osvaldo ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral Com esta ultima alteração os resultados são os mesmos. Nao existe nenhuma outra dependência, ao actualizar uma coordenada a outra deve ser automaticamente modificada. Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] ajuda com disparador
On Tue, Nov 16, 2010 at 21:02, Osvaldo Kussama osvaldo.kuss...@gmail.comwrote: Em 16 de novembro de 2010 17:22, Eloi Ribeiro eloi.ribe...@gmail.com escreveu: Com esta ultima alteração os resultados são os mesmos. Nao existe nenhuma outra dependência, ao actualizar uma coordenada a outra deve ser automaticamente modificada. Eloi IF (NEW.x100 IS NOT NULL) THEN NEW.x = NEW.x100/100; END IF; É isso? Calcular um novo x em função de x100? CREATE OR REPLACE FUNCTION funcao_teste() RETURNS trigger AS $$ BEGIN IF (TG_OP = 'INSERT') THEN IF (NEW.x IS NOT NULL) THEN NEW.x100 = NEW.x*100; ELSE NEW.x = NEW.x100/100; END IF; ELSE IF (TG_OP = 'UPDATE') THEN IF (NEW.x IS NOT NULL) THEN NEW.x100 = NEW.x*100; ELSE IF (NEW.x100 IS NOT NULL) THEN NEW.x = NEW.x100/100; END IF; END IF; END IF; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; Osvaldo __ Tens razão tinha ai um erro, mas mesmo assim com ultimo UPDATE (ver mais a baixo) não se obtém o resultado esperado. Não entendo o que está mal... INSERT INTO sch_temp.teste(x) VALUES(1); INSERT INTO sch_temp.teste(x100) VALUES (200); SELECT * FROM sch_temp.teste; 1;1;100 2;2;200 Resultado esperado. UPDATE sch_temp.teste SET x = 3 WHERE x = 2; SELECT * FROM sch_temp.teste; 1;1;100 2;3;300 Resultado esperado. UPDATE sch_temp.teste SET x100 = 200 WHERE x = 3; SELECT * FROM sch_temp.teste; 1;1;100 2;3;300 Resultado NÃO esperado. Deveria ser: 1;1;100 2;2;200 Eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] ajuda com disparador
Olá à lista, Queria fazer um disparador sobre uma tabela com dois campos do tipo 'Geometry' (geom_23030 e geom_4258) cada um com um sistema de coordenadas diferente. A ideia era que o disparador actualiza-se o segundo campo sempre que houvesse um INSERT ou UPDATE no primeiro campo e assim tivessem sempre a mesma geometria mas cada um dos campos com o seu respectivo sistemas de coordenadas. Devido à minha falta de experiência em plpgsql eu não sei como fazer para que o disparador reconheça qual a geometria mais recente e proceder com a actualização da mais antiga. Como tenho feito, actualiza por ordem de como está indicado no disparador sem ter em conta a antiguidade. Deveria adicionar dois novos campos com Time Stamp de cada uma das geometrias para conseguir o meu objectivo? Estou a usar algumas das funções disponibilizadas pela extensão PostGIS. Isto foi o que consegui fazer: --SELECT DropGeometryColumn('sch_temp','teste','geom_23030'); --SELECT DropGeometryColumn('sch_temp','teste','geom_4258'); --DROP TABLE sch_temp.teste; CREATE TABLE sch_temp.teste (gid serial primary key, longitude double precision); SELECT AddGeometrycolumn ('sch_temp','teste','geom_23030',23030,'LINESTRING',2); SELECT AddGeometrycolumn ('sch_temp','teste','geom_4258',4258,'LINESTRING',2); CREATE OR REPLACE FUNCTION funcao_teste() RETURNS trigger AS $$ BEGIN -- Se o campo geom_4258 tem um novo INSERT ou UPDATE, entao actualiza geom_23030. NEW.geom_23030 = ST_Transform((NEW.geom_4258), 23030); -- Se o campo geom_23030 tem um novo INSERT ou UPDATE, entao actualiza geom_4258. NEW.geom_4258 = ST_Transform((NEW.geom_23030), 4258); -- Calcula/actualiza a longitude da geometria. NEW.longitude = ST_Length(NEW.geom_23030); RETURN NEW; END; $$ LANGUAGE plpgsql; DROP TRIGGER IF EXISTS funcao_teste ON sch_temp.teste; CREATE TRIGGER funcao_teste BEFORE INSERT OR UPDATE ON sch_temp.teste FOR EACH ROW EXECUTE PROCEDURE funcao_teste(); INSERT INTO sch_temp.teste(geom_23030) VALUES(ST_GeomFromText('SRID=23030;LINESTRING(232400 4548000,700882 4548000)')); INSERT INTO sch_temp.teste(geom_4258) VALUES (ST_GeomFromText('SRID=4258;LINESTRING(-6 38,-1 38)')); UPDATE sch_temp.teste SET geom_4258 = ST_GeomFromText('SRID=4258;LINESTRING(-5 37,-1 37)') WHERE gid = 2; SELECT gid, longitude, ST_AsText(geom_23030), ST_AsText(geom_4258) FROM sch_temp.teste; Obrigado. Cumprimentos, Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] quantos campos tem uma tabela?
Olá à lista, Existe uma maneira de saber quantos campos tem uma determinada tabela com uma consulta SQL? Obrigado! Saudações, Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] quantos campos tem uma tabela?
OK, já encontrei a resposta, assim: SELECT count(column_name) FROM information_schema.columns WHERE table_name ='nome_da_tabela'; Obrigado, Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com 2010/9/24 Eloi Ribeiro eloi.ribe...@gmail.com Olá à lista, Existe uma maneira de saber quantos campos tem uma determinada tabela com uma consulta SQL? Obrigado! Saudações, Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ 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 converter DOY em data (AAAA-MM-DD)?
Bem respondo a mim mesmo. Como tinha outro campo (tai93) com 'Seconds counted from UTC midnight Jan. 1, 1993' fiz: UPDATE tabela SET date = CAST(tai93/86400 AS INT) + CAST('1993-01-01' AS DATE); E já tenho a data no formato desejado. Obrigado, Ciao, Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com 2010/9/2 Eloi Ribeiro eloi.ribe...@gmail.com Ola! Numa tabela tenho o campo 'year' (smallint) com o ano e o campo 'day_j' (smallint) com o dia do ano, de 1 a 366. Como faço para passar a data ISO 8601 (-MM-DD)? Obrigado pela atenção. Cumprimentos, Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ 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 converter DOY em data (AAAA-MM-DD)?
On Thu, Sep 2, 2010 at 14:24, Fabrízio de Royes Mello fabriziome...@gmail.com wrote: Em 2 de setembro de 2010 05:56, Eloi Ribeiro eloi.ribe...@gmail.comescreveu: Ola! Numa tabela tenho o campo 'year' (smallint) com o ano e o campo 'day_j' (smallint) com o dia do ano, de 1 a 366. Como faço para passar a data ISO 8601 (-MM-DD)? Tente: postg...@bdteste=# select extract(doy from current_date); date_part --- 245 (1 row) postg...@bdteste=# select to_date('2010-245', '-DDD'); to_date 2010-09-02 (1 row) Boa, funciona estupendamente, terei em conta esta dica. Obrigado! Eloi Ribeiro GIS Analyst 39,45º -4,40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Serviço PostgreSQL não arranca em windows após apagado abrupto
2009/9/15 Tarcísio Sassara sassara.tarci...@gmail.com Me parece que você fechou a janela pela qual iniciou o serviço com o pg_ctl start Isso ocorreu comigo quando estava testando a versão binária do postgres 8.4 no windows alguns dias atrás. Como resolvi: Quando fui encerrar o banco, abri uma segunda janela e executei o comando para parar o postgres com o comando pg_ctl stop... Se você conseguir tornar o postgres um serviço do windows, provavelmente não terá este problema. A versão do instalável do postgres 8.4 não te serve? Acho que com o instalador você terá mais sucesso. http://www.enterprisedb.com/products/pgdownload.do Queria evitar uma nova instalação, o óptimo seria poder recuperar os dados. eloi -- Eloi Ribeiro GIS Analyst 39.45º -4.40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Serviço PostgreSQL não arranca em windows após apagado abrupto
Obrigado pela dica Tiago, suponho que me servirá no futuro. A final optei por desinstalar PostgreSQL 8.3 e instalei a nova versão (8.4) agora estou restaurando a base de dados com calma e a deixar todo documentado, o que antes não fiz. Obrigado, Eloi 2009/9/16 Tiago Adami adam...@gmail.com Para iniciar o banco através do console eu utilizo um atalho para o CMD.EXE no desktop, clico com o botão direito sobre o atalho e aciono o menu Executar Como. Seleciono o usuário postgres, informo a senha e o console é aberto rodando como usuário postgres. Desta forma, eu acesso o diretório de instalação do banco (no meu caso D:\PostgreSQL\8.3) e inicio o banco de dados através do comando: D:\PostgreSQL\8.3bin\postgres -D D:\PostgreSQL\8.3\data Todas as informações do log são impressas no console. Para encerrar o banco, apenas pressione CTRL+C, ou então feche a janela do MS-DOS. Depois de carregar o cluster desta forma, tente reindexar o banco através do reindexdb.exe em outro console. -- TIAGO J. ADAMI http://www.adamiworks.com adamitj at gmail dot com Dois Vizinhos - PR 2009/9/15 Eloi Ribeiro eloi.ribe...@gmail.com 2009/9/15 André Volpato andre.volp...@ecomtecnologia.com.br Eloi Ribeiro escreveu: Olá a toda a lista, Tenho um computador com windows (xp prof. ver. 2002 com SP3), *PostgreSQL *8.3.5-2 e *PostGIS *1.3.5, este computador estava a realizar uma tarefa (de longa duração) de análise em *PostgreSQL+PostGIS* quando abruptamente o computador foi apagado, ao reiniciar o computador o serviço não arrancou registando no *log* as seguintes mensagens: 2009-09-15 08:34:38 CEST LOG: database system was interrupted while in recovery at 2009-09-14 14:06:32 CEST 2009-09-15 08:34:38 CEST HINT: This probably means that some data is corrupted and you will have to use the last backup for recovery. 2009-09-15 08:34:38 CEST LOG: database system was not properly shut down; automatic recovery in progress 2009-09-15 08:34:38 CEST LOG: redo starts at 67/C5C956D8 2009-09-15 08:34:38 CEST LOG: unexpected pageaddr 67/BDFD in log file 103, segment 197, offset 16580608 2009-09-15 08:34:38 CEST LOG: redo done at 67/C5FCFFB0 2009-09-15 08:34:38 CEST FATAL: index 9065509 contains unexpected zero page at block 0 2009-09-15 08:34:38 CEST HINT: Please REINDEX it. 2009-09-15 08:34:38 CEST LOG: startup process (PID 3476) exited with exit code 1 2009-09-15 08:34:38 CEST LOG: aborting startup due to startup process failure (...) Você tentou rodar um REINDEX, como está escrito no log ? []´s, ACV Não o tinha tentado. Suponho que é assim: postgres --single -D C:\Archivos de programa\PostgreSQL\8.3\data -P nome_da_bd e depois seria: REINDEX SYSTEM nome_da_bd Mas não consigo arrancar o *postmaster*, dá-me a seguinte mensagem: Execution of PostgreSQL by a user with administrative permissions is not permitted. The server must be started under an unprivileged user ID to prevent possible system security compromises. See the documentation for more information on how to properly start thr server. Reinicio a sessão com um utilizador não administrador, e tenho o seguinte: could not create lock file postmaster.pid: Permission denied Alguma pista? eloi ___ 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 -- Eloi Ribeiro GIS Analyst 39.45º -4.40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] Serviço PostgreSQL não arranca em windows após apagado abrupto
Olá a toda a lista, Tenho um computador com windows (xp prof. ver. 2002 com SP3), *PostgreSQL *8.3.5-2 e *PostGIS *1.3.5, este computador estava a realizar uma tarefa (de longa duração) de análise em *PostgreSQL+PostGIS* quando abruptamente o computador foi apagado, ao reiniciar o computador o serviço não arrancou registando no *log* as seguintes mensagens: 2009-09-15 08:34:38 CEST LOG: database system was interrupted while in recovery at 2009-09-14 14:06:32 CEST 2009-09-15 08:34:38 CEST HINT: This probably means that some data is corrupted and you will have to use the last backup for recovery. 2009-09-15 08:34:38 CEST LOG: database system was not properly shut down; automatic recovery in progress 2009-09-15 08:34:38 CEST LOG: redo starts at 67/C5C956D8 2009-09-15 08:34:38 CEST LOG: unexpected pageaddr 67/BDFD in log file 103, segment 197, offset 16580608 2009-09-15 08:34:38 CEST LOG: redo done at 67/C5FCFFB0 2009-09-15 08:34:38 CEST FATAL: index 9065509 contains unexpected zero page at block 0 2009-09-15 08:34:38 CEST HINT: Please REINDEX it. 2009-09-15 08:34:38 CEST LOG: startup process (PID 3476) exited with exit code 1 2009-09-15 08:34:38 CEST LOG: aborting startup due to startup process failure Existe alguma maneira de por a base de dados outra vez a funcionar? Não tenho um *dump *para um *restore*. Tenho sim os dados em csv, shp e alguns *scripts *sql para a criação de esquemas, usuários e algumas das tabelas. Tentando remediar a situação, resolvi criar de zero um novo *cluster*, com as seguintes sentencias: -- initdb -U postgres -E UTF8 -D C:\Archivos de programa\PostgreSQL\8.3\data pg_ctl -D C:\Archivos de programa\PostgreSQL\8.3\data -l logfile start psql -U postgres -f C:\Archivos de programa\PostgreSQL\8.3\share\contrib\adminpack.sql createdb -U postgres -E UTF8 -O postgres -T postgres postgis createlang -U postgres plpgsql postgis psql -U postgres -d postgis -f C:\Archivos de programa\PostgreSQL\8.3\share\contrib\lwpostgis.sql psql -U postgres -d postgis -f C:\Archivos de programa\PostgreSQL\8.3\share\contrib\spatial_ref_sys.sql -- Este funciona perfeitamente até que deixa de funcionar ao fechar a consola onde foram executadas as anteriores sentencias mencionadas! Reiniciando o computador o serviço continua sem arrancar, tenho de abrir a consola e executar de novo pg_ctl -D C:\Archivos de programa\PostgreSQL\8.3\data -l logfile start e não fechar a consola porque senão deixa de funcionar! O que tenho de fazer para que o serviço de *PostgreSQL *arranque ao iniciar o sistema operativo, seja tanto com o anterior *cluster *ou com o novo? Fui ver se este serviço ainda existia, e parece estar tudo bem: Em ferramentas administrativas-Serviços-PostgreSQL Database Server 8.3-Acesso ao executável: C:\Archivos de programa\PostgreSQL\8.3\bin\pg_ctl.exe runservice -w -N pgsql-8.3 -D C:\Archivos de programa\PostgreSQL\8.3\data\ Obrigado por ler e pelos comentários, espero que tenha exposto o meu problema com claridade. Atentamente, -- Eloi Ribeiro GIS Analyst 39.45º -4.40º http://eloiribeiro.wordpress.com ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] Serviço PostgreSQL não arranca em windows após apagado abrupto
2009/9/15 André Volpato andre.volp...@ecomtecnologia.com.br Eloi Ribeiro escreveu: Olá a toda a lista, Tenho um computador com windows (xp prof. ver. 2002 com SP3), *PostgreSQL *8.3.5-2 e *PostGIS *1.3.5, este computador estava a realizar uma tarefa (de longa duração) de análise em *PostgreSQL+PostGIS* quando abruptamente o computador foi apagado, ao reiniciar o computador o serviço não arrancou registando no *log* as seguintes mensagens: 2009-09-15 08:34:38 CEST LOG: database system was interrupted while in recovery at 2009-09-14 14:06:32 CEST 2009-09-15 08:34:38 CEST HINT: This probably means that some data is corrupted and you will have to use the last backup for recovery. 2009-09-15 08:34:38 CEST LOG: database system was not properly shut down; automatic recovery in progress 2009-09-15 08:34:38 CEST LOG: redo starts at 67/C5C956D8 2009-09-15 08:34:38 CEST LOG: unexpected pageaddr 67/BDFD in log file 103, segment 197, offset 16580608 2009-09-15 08:34:38 CEST LOG: redo done at 67/C5FCFFB0 2009-09-15 08:34:38 CEST FATAL: index 9065509 contains unexpected zero page at block 0 2009-09-15 08:34:38 CEST HINT: Please REINDEX it. 2009-09-15 08:34:38 CEST LOG: startup process (PID 3476) exited with exit code 1 2009-09-15 08:34:38 CEST LOG: aborting startup due to startup process failure (...) Você tentou rodar um REINDEX, como está escrito no log ? []´s, ACV Não o tinha tentado. Suponho que é assim: postgres --single -D C:\Archivos de programa\PostgreSQL\8.3\data -P nome_da_bd e depois seria: REINDEX SYSTEM nome_da_bd Mas não consigo arrancar o *postmaster*, dá-me a seguinte mensagem: Execution of PostgreSQL by a user with administrative permissions is not permitted. The server must be started under an unprivileged user ID to prevent possible system security compromises. See the documentation for more information on how to properly start thr server. Reinicio a sessão com um utilizador não administrador, e tenho o seguinte: could not create lock file postmaster.pid: Permission denied Alguma pista? eloi ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] update com um disparador
Ola a toda a lista. Estou tentar fazer um disparador (trigger) que actualize um campo de uma tabela com o campo de outra tabela. Se os campos estão na mesma tabela já entendi como se faz, mas quando não é o caso como se poderia fazer? exemplo: create or replace function nome_funcao() returns trigger as ' begin NEW.campo0 = NEW.campo1 + NEW.campo2; -- aqui tudo bem -- aqui está a minha duvida, como fazer um update UPDATE tabela1 SET campo0 = tabela2.campo0 FROM tabela2 where tabela1.id = tabela2.id; return NEW; end; ' language plpgsql; create trigger nome_disparador before insert or update on tabela1 for each row execute procedure nome_funcao(); Alguem me pode dar umas dicas? Muito obrigado. Ciao, -- Eloi Ribeiro http://www.google.com/s2/profiles/100374240045472689555?zx=3p06h0iaagvn eloi.ribeiro ARROBA gmail PONTO com http://eloiribeiro.blogspot.com España, Valencia Antes de imprimir pensa que estará a gastar papel, tinta e energia. Apaga todos os endereços de email do cabeçalho, bem como qualquer um que apareça no corpo da mensagem. Essa informação é privada. Coloca os endereços dos destinatários em BCC ou CCo. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] update com um disparador
Perfeito, era isso mesmo, muito obrigado Osvaldo. Saudações, Eloi 2008/12/9 Osvaldo Kussama [EMAIL PROTECTED] Em 09/12/08, Eloi Ribeiro[EMAIL PROTECTED] escreveu: Ola a toda a lista. Estou tentar fazer um disparador (trigger) que actualize um campo de uma tabela com o campo de outra tabela. Se os campos estão na mesma tabela já entendi como se faz, mas quando não é o caso como se poderia fazer? exemplo: create or replace function nome_funcao() returns trigger as ' begin NEW.campo0 = NEW.campo1 + NEW.campo2; -- aqui tudo bem -- aqui está a minha duvida, como fazer um update UPDATE tabela1 SET campo0 = tabela2.campo0 FROM tabela2 where tabela1.id= tabela2.id; Pelo que entendi no lugar do UPDATE acima use: SELECT tabela2.campo0 INTO new.campo0 FROM tabela2 WHERE tabela2.id = new.id; return NEW; end; ' language plpgsql; create trigger nome_disparador before insert or update on tabela1 for each row execute procedure nome_funcao(); Osvaldo ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- Eloi Ribeiro http://www.google.com/s2/profiles/100374240045472689555?zx=3p06h0iaagvn eloi.ribeiro ARROBA gmail PONTO com http://eloiribeiro.blogspot.com España, Valencia Antes de imprimir pensa que estará a gastar papel, tinta e energia. Apaga todos os endereços de email do cabeçalho, bem como qualquer um que apareça no corpo da mensagem. Essa informação é privada. Coloca os endereços dos destinatários em BCC ou CCo. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] apagar registos repetidos
Saudações à lista, Tenho a seguinte duvida: Numa tabela onde existem registos repetidos, ou seja, onde a combinação entre o campo1(smallint) e campo2(date) se repetem. Gostaria de eliminar todos os registos repetidos excepto o que tenha no campo3(date) a data mais recente. |campo1 (smallint) | campo2 (date) | campo3 (date) | |--| | 1| 2008-06-12 | 2008-06-12| - eliminar | 1| 2008-06-12 | 2008-11-06| (...) Muito obrigado pelas vossas sugestões. Ciao, -- Eloi Ribeiro eloi.ribeiro ARROBA gmail PONTO com http://eloiribeiro.blogspot.com España, Valencia Antes de imprimir pensa que estará a gastar papel, tinta e energia. Apaga todos os endereços de email do cabeçalho, bem como qualquer um que apareça no corpo da mensagem. Essa informação é privada. Coloca os endereços dos destinatários em BCC ou CCo. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
[pgbr-geral] update com a data mais recente desse registo
Olá à lista, Tenho a seguinte duvida: Numa tabela com a seguinte estrutura: |-||-|--| | id | data1(tipo:Date) | data2(tipo:Date) | data3(tipo:Date) | |-||-|--| | 1 | 2006-10-02 |2006-10-23 | | (...) Necessito actualizar o campo data3 com a data mais recente dos campos data1 e data2 do mesmo registo. Tentei da seguinte maneira: UPDATE tabela SET data3 = max(data1, data2) WHERE id = 1; Mas não funcionou. Mesmo que funcionasse teria que repetir a consulta para todos os id's existentes com recurso a um script ou gatilho, é possível fazer-lo apenas com SQL, sem usar gatilho ou script? Muito obrigado. atentamente, -- Eloi Ribeiro eloi.ribeiro ARROBA gmail PONTO com http://eloiribeiro.blogspot.com Espanha, Valência Antes de imprimir pensa que estará a gastar papel, tinta e energia. Apaga todos os endereços de email do cabeçalho, bem como qualquer um que apareça no corpo da mensagem. Essa informação é privada. Coloca os endereços dos destinatários em BCC ou CCo. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] update com a data mais recente desse registo
Não aceita os dois pontos ERROR: syntax error at or near : LINE 129: ...la SET data3 = CASE WHEN data2 data1 : data2 else... ^ Alguma sugestão? Estou utilizando a versão 8.2.7 em windows xp com pgAdmin III 1.8.4. 2008/9/1 William Leite Araújo [EMAIL PROTECTED] 2008/9/1 Eloi Ribeiro [EMAIL PROTECTED] Olá à lista, Tenho a seguinte duvida: Numa tabela com a seguinte estrutura: |-||-|-- | | id | data1(tipo:Date) | data2(tipo:Date) | data3(tipo:Date) | |-||-|-- | | 1 | 2006-10-02 |2006-10-23 | | (...) Necessito actualizar o campo data3 com a data mais recente dos campos data1 e data2 do mesmo registo. Tentei da seguinte maneira: UPDATE tabela SET data3 = max(data1, data2) WHERE id = 1; Mas não funcionou. É porque a função max não existe. Você pode: 1) Criá-la 2) Mudar o teste Mesmo que funcionasse teria que repetir a consulta para todos os id's existentes com recurso a um script ou gatilho, é possível fazer-lo apenas com SQL, sem usar gatilho ou script? Uma simples consulta SQL, sem a cláusula WHERE irá atualizar TODOS os registros da sua tabela. Ex.: *UPDATE* tabela *SET* data3 = *CASE WHEN* data2 data1 : data 2*ELSE * data1 *END*; Muito obrigado. atentamente, -- Eloi Ribeiro eloi.ribeiro ARROBA gmail PONTO com http://eloiribeiro.blogspot.com Espanha, Valência Antes de imprimir pensa que estará a gastar papel, tinta e energia. Apaga todos os endereços de email do cabeçalho, bem como qualquer um que apareça no corpo da mensagem. Essa informação é privada. Coloca os endereços dos destinatários em BCC ou CCo. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- William Leite Araújo Analista de Banco de Dados - QualiConsult ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- Eloi Ribeiro eloi.ribeiro ARROBA gmail PONTO com http://eloiribeiro.blogspot.com Espanha, Valência Antes de imprimir pensa que estará a gastar papel, tinta e energia. Apaga todos os endereços de email do cabeçalho, bem como qualquer um que apareça no corpo da mensagem. Essa informação é privada. Coloca os endereços dos destinatários em BCC ou CCo. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] update com a data mais recente desse registo
ok já está mudei os deoi pontos por THEN e perfeito. Muito obrigado pela ajuda! ciao, eloi 2008/9/1 Eloi Ribeiro [EMAIL PROTECTED] Não aceita os dois pontos ERROR: syntax error at or near : LINE 129: ...la SET data3 = CASE WHEN data2 data1 : data2 else... ^ Alguma sugestão? Estou utilizando a versão 8.2.7 em windows xp com pgAdmin III 1.8.4. 2008/9/1 William Leite Araújo [EMAIL PROTECTED] 2008/9/1 Eloi Ribeiro [EMAIL PROTECTED] Olá à lista, Tenho a seguinte duvida: Numa tabela com a seguinte estrutura: |-||-|-- | | id | data1(tipo:Date) | data2(tipo:Date) | data3(tipo:Date) | |-||-|-- | | 1 | 2006-10-02 |2006-10-23 | | (...) Necessito actualizar o campo data3 com a data mais recente dos campos data1 e data2 do mesmo registo. Tentei da seguinte maneira: UPDATE tabela SET data3 = max(data1, data2) WHERE id = 1; Mas não funcionou. É porque a função max não existe. Você pode: 1) Criá-la 2) Mudar o teste Mesmo que funcionasse teria que repetir a consulta para todos os id's existentes com recurso a um script ou gatilho, é possível fazer-lo apenas com SQL, sem usar gatilho ou script? Uma simples consulta SQL, sem a cláusula WHERE irá atualizar TODOS os registros da sua tabela. Ex.: *UPDATE* tabela *SET* data3 = *CASE WHEN* data2 data1 : data 2*ELSE * data1 *END*; Muito obrigado. atentamente, -- Eloi Ribeiro eloi.ribeiro ARROBA gmail PONTO com http://eloiribeiro.blogspot.com Espanha, Valência Antes de imprimir pensa que estará a gastar papel, tinta e energia. Apaga todos os endereços de email do cabeçalho, bem como qualquer um que apareça no corpo da mensagem. Essa informação é privada. Coloca os endereços dos destinatários em BCC ou CCo. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- William Leite Araújo Analista de Banco de Dados - QualiConsult ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- Eloi Ribeiro eloi.ribeiro ARROBA gmail PONTO com http://eloiribeiro.blogspot.com Espanha, Valência Antes de imprimir pensa que estará a gastar papel, tinta e energia. Apaga todos os endereços de email do cabeçalho, bem como qualquer um que apareça no corpo da mensagem. Essa informação é privada. Coloca os endereços dos destinatários em BCC ou CCo. -- Eloi Ribeiro eloi.ribeiro ARROBA gmail PONTO com http://eloiribeiro.blogspot.com Espanha, Valência Antes de imprimir pensa que estará a gastar papel, tinta e energia. Apaga todos os endereços de email do cabeçalho, bem como qualquer um que apareça no corpo da mensagem. Essa informação é privada. Coloca os endereços dos destinatários em BCC ou CCo. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] update com a data mais recente desse registo
pode ser, mas sem essa ajuda não teria chagado ao resultado. obrigado abraço, eloi 2008/9/1 William Leite Araújo [EMAIL PROTECTED] Ops... acho que programar em Java está afetando meus SQL... =D 2008/9/1 William Leite Araújo [EMAIL PROTECTED] (...) Ex.: *UPDATE* tabela *SET* data3 = *CASE WHEN* data2 data1 : data 2*ELSE * data1 *END*; (...) Correto: *UPDATE* tabela *SET* data3 = *CASE WHEN* data2 data1 * THEN* data 2* ELSE* data1 *END*; -- William Leite Araújo Analista de Banco de Dados - QualiConsult ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- Eloi Ribeiro eloi.ribeiro ARROBA gmail PONTO com http://eloiribeiro.blogspot.com Espanha, Valência Antes de imprimir pensa que estará a gastar papel, tinta e energia. Apaga todos os endereços de email do cabeçalho, bem como qualquer um que apareça no corpo da mensagem. Essa informação é privada. Coloca os endereços dos destinatários em BCC ou CCo. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] update com a data mais recente desse registo
Obrigado Osvaldo, terei em conta a sugestão. saudações, eloi 2008/9/1 Osvaldo Kussama [EMAIL PROTECTED] Em 01/09/08, Eloi Ribeiro[EMAIL PROTECTED] escreveu: Tenho a seguinte duvida: Numa tabela com a seguinte estrutura: |-||-|--| | id | data1(tipo:Date) | data2(tipo:Date) | data3(tipo:Date) | |-||-|--| | 1 | 2006-10-02 |2006-10-23 | | (...) Necessito actualizar o campo data3 com a data mais recente dos campos data1 e data2 do mesmo registo. Tentei da seguinte maneira: UPDATE tabela SET data3 = max(data1, data2) WHERE id = 1; Mas não funcionou. Mesmo que funcionasse teria que repetir a consulta para todos os id's existentes com recurso a um script ou gatilho, é possível fazer-lo apenas com SQL, sem usar gatilho ou script? Utilize GREATEST: UPDATE tabela SET data3 = GREATEST(data1, data2) WHERE id = 1; http://www.postgresql.org/docs/current/interactive/functions-conditional.html#AEN14508 Osvaldo ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- Eloi Ribeiro eloi.ribeiro ARROBA gmail PONTO com http://eloiribeiro.blogspot.com Espanha, Valência Antes de imprimir pensa que estará a gastar papel, tinta e energia. Apaga todos os endereços de email do cabeçalho, bem como qualquer um que apareça no corpo da mensagem. Essa informação é privada. Coloca os endereços dos destinatários em BCC ou CCo. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] PostGIS
Manual PostGIS http://www.webgis.com.br/postgis/ Sumário PostGIS é uma extensão ao sistema de banco de dados object-relational PostgreSQL, que permite o uso de objetos GIS (Sistemas de Informação Geográfica) serem armazenados em banco de dados. PostGIS inclui suporte para índices espacias GiST-based R-Tree e funções para análise e processamento de objetos GIS. Este é um manual da versão 1.2.2SVN Boa sorte, Eloi 2008/8/12 Marcelo Costa [EMAIL PROTECTED] Olá, bom dia! 2008/8/12 Cézar Augusto Ferreira [EMAIL PROTECTED] Galera, alguém sabe onde eu consigo material sobre PostGIS, cartografia, Sistemas de coordenadas, essas paradas assim? Obrigado! Procure por http://www.geolivre.org.br/http://www.geolivre.org.br/downloads/geozine/geozine-n01-v20-16ago2007.pdf, há artigos e tutoriais que podem te ajudar. Att, -- Marcelo Costa ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral -- Eloi Ribeiro eloi.ribeiro ARROBA gmail PONTO com http://eloi-ribeiro.blogspot.com Espanha, Valência Antes de imprimir pensa que estará a gastar papel, tinta e energia. Apaga todos os endereços de email do cabeçalho, bem como qualquer um que apareça no corpo da mensagem. Essa informação é privada e não publica. Protege os endereços dos destinatários colocando os mesmos em BCC ou CCo. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] especificar a nova localização do cluster no boot do sistema
Obrigado pelos vossos comentários foram de grande ajuda. Ciao, Eloi 2008/7/1 Leonardo Cezar [EMAIL PROTECTED]: 2008/6/30 Eloi Ribeiro [EMAIL PROTECTED]: Obrigado pela resposta. http://www.postgresql.org.br/RegrasLista Duvidas: 1. É mesmo necessário o drop do cluster '/var/lib/postgresql/8.3/main/'? Se refere-se a uma instalação do Debian, não. Utilize pg_upgradecluster ao invés. 2. Com 'pg_createcluster -u postgres --start-conf 8.3 seucluster' vou criar outro cluster? Certo?. Mas já o tenho criado em '/media/HDB/PostgreSQL/Data', apenas quero que quando inicie o PC e entre em psql o cluster seja este '/media/HDB/PostgreSQL/Data' e não este '/var/lib/postgresql/8.3/main/'. Visualize seus clusters em execução (pg_lsclister) e escolha um dos métodos: * psql --cluster 8.3/main ; * export PGCLUSTER=8.3/main; * echo nome_user\tgroup\t8.3\tmain\tpostgres /etc/ostgresql-common/user_clusters; * echo nome_user\tgroup\t8.3\tmain\tpostgres $HOME/.postgresqlrc De momento o que faço para mudar de cluster é: su postgres /etc/init.d/postgresql-8.3 stop /usr/lib/postgresql/8.3/bin/pg_ctl -D /media/HDB/PostgreSQL/Data start pg_ctlcluster 8.3 nome_cluster stop Mas resulta incomodo fazer-lo cada vez que inicio o PC e gostaria de saber como o configurar. Altere o valor de start.conf Abraço! -Leo -- Leonardo Cezar http://pgcon.postgresql.org.br http://www.dextra.com.br/postgres -- Eloi Ribeiro eloi.ribeiro ARROBA gmail PONTO com http://eloi-ribeiro.blogspot.com Espanha, Valência Antes de imprimir pensa que estará a gastar papel, tinta e energia. Apaga todos os endereços de email do cabeçalho, bem como qualquer um que apareça no corpo da mensagem. Essa informação é privada e não publica. Protege os endereços dos destinatários colocando os mesmos em BCC ou CCo. ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
Re: [pgbr-geral] especificar a nova localização do cluster no boot do sistema
Obrigado pela resposta. Se entendo bem, sugeres que faça um drop do cluster que foi criado por defeito na instalação, em /var/lib/postgresql/8.3/main/, e crie um novo. E isso? Duvidas: 1. É mesmo necessário o drop do cluster '/var/lib/postgresql/8.3/main/'? 2. Com 'pg_createcluster -u postgres --start-conf 8.3 seucluster' vou criar outro cluster? Certo?. Mas já o tenho criado em '/media/HDB/PostgreSQL/Data', apenas quero que quando inicie o PC e entre em psql o cluster seja este '/media/HDB/PostgreSQL/Data' e não este '/var/lib/postgresql/8.3/main/'. De momento o que faço para mudar de cluster é: su postgres /etc/init.d/postgresql-8.3 stop /usr/lib/postgresql/8.3/bin/pg_ctl -D /media/HDB/PostgreSQL/Data start Mas resulta incomodo fazer-lo cada vez que inicio o PC e gostaria de saber como o configurar. Espero que me tenha explicado bem. Muito obrigado pelas sugestões. Saudações, Eloi Seg, 2008-06-30 às 09:01 -0300, Fernando Ike de Oliveira escreveu: Em Fri, 27 Jun 2008 21:30:17 +0200 Eloi Ribeiro [EMAIL PROTECTED] escreveu: Olá a toda a lista, tenho a seguinte duvida. Estou a usando Ubuntu 8.04 e recentemente instalei PostgreSQL 8.3, criei um novo cluster em /media/HDB/PostgreSQL/Data. Arranquei a base de dados nesse cluster, cria umas base de dados de testes e tudo funciona perfeito, mas quando reinicio o PC o cluster passa á localização original de quando foi instalado PostgreSQL. Poderiam dizer como posso especificar a nova localização do cluster no boot do sistema. Eloi, Isso acontece porque no Debian e derivados tem alguns scripts para facilitar o uso de várias instâncias de PostgreSQL na mesma máquina. Com o backup feito, para remover do local original e adicionar um novo cluster faça: #pg_dropcluster 8.3 main #pg_createcluster -u postgres --start-conf 8.3 seucluster Saudações, ___ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral