--
Matheus de Oliveira

Bacharelado em Ciências de Computação
Laboratório de Computação de Alto Desempenho -
LCAD<http://www.lcad.icmc.usp.br/>
Instituto de Ciências Matemáticas e de Computação -
ICMC<http://www.icmc.usp.br/>
Universidade de São Paulo - USP <http://www.sc.usp.br/>




2012/7/18 Matheus de Oliveira <[email protected]>

>
>
> 2012/7/18 Alexsander Rosa <[email protected]>
>
>> Hoje eu coloco no SVN um "pg_dump" com a estrutura do BD (--schema-only).
>> Cada vez que preciso mexer numa procedure tenho que selecionar a procedure
>> desejada, copiar e colar em algum editor, acrescentar o "OR REPLACE" depois
>> do CREATE e só então começar a fazer alguma coisa. E depois de pronta, a
>> procedure só entra no SVN via o "pg_dump" seguinte.
>
>
> Para isso você pode usar o "\ef" do psql, que já faz isso pra você, é só
> selecionar o editor (e.g. "export EDITOR=vim") e executar:
>
> \ef <nome da função>
>
>
>> Eu gostaria que houvesse uma opção no "pg_dump" tipo
>> "--procedures-in-separate-files" que gerasse o DUMP sem as procedures;
>> estas, por sua vez, seriam gravadas em arquivos individuais chamados
>> "nome-da-procedure.sql" já com o "OR REPLACE" adicionado. Existe alguma
>> ferramenta que faça isso?
>>
>>
> Não sei se tem algo assim pronto, mas não é difícil fazer se você aliar a
> tabela pg_proc e a função pg_get_functiondef.
> Exemplo:
>
> SELECT pg_get_functiondef(oid) FROM pg_proc WHERE proname = '<nome da
> função>'
>
> Veja que o retorno será mais de uma linha se a função estiver
> sobrecarregada.
>
>
Fiz um pequeno shell script pra isso. Vai ser útil pra mim também:

#!/bin/bash

./psql $@ -A -t -F '|' -c "
SELECT quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '.' ||
ROW_NUMBER() OVER(PARTITION BY n.nspname,p.proname) || '.sql', p.oid FROM
pg_proc p JOIN pg_namespace n ON n.oid = p.pronamespace WHERE NOT
p.proisagg AND n.nspname NOT LIKE 'pg_%' AND n.nspname <>
'information_schema' ORDER BY n.nspname, p.proname, p.oid;
" | while read LN; do
    ./psql $@ -A -t -c "SELECT pg_get_functiondef(`echo $LN | cut -d '|' -f
2`)" > `echo $LN | cut -d '|' -f 1`
done

Uso:

   - salvar o texto acima num arquivo chamado "get_functions.sh" (ou
   qualquer outro nome).
   - executar:
   chmod a+x get_functions.sh
   - chamar o script da mesma forma como chamaria o psql. Exemplo:
   /path/to/get_functions.sh -h <host> -p <porta> -U <usuário> <banco>
   - serão gerados arquivos seguindo o modelo <schema>.<func
name>.<id>.sqlno diretório corrente (id é um identificador simples e
sequencial, um para
   cada função sobrecarregada, se não tiver sobrecarga será só 1).


Mais fácil que isso impossível...=P

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

Responder a