2014/1/13 Paulo <[email protected]>
>
>
> Ola Pessoal,
>
>
>
> Precisei restaurar dados vindos de outro banco.
>
> As sequencias ficaram desatualizadas, preciso atualizar todas as tabelas
> automaticamente.
>
>
>
> Estou executando a sentença abaixo para sincronizar uma a uma, mais esta
> muito trabalhoso.
>
> SELECT pg_catalog.setval(pg_catalog.pg_get_serial_sequence(cliente,
> 'codigo'), 3608, true);
>
>
>
> Alguém pode dar uma dica ¿
>
Se você criou suas sequências usando o pseudo-tipo serial, ou associou-as
com as colunas pelo CREATE/ALTER SEQUENCE ... OWNED BY, então a solução
para o seu problema é bem simples.
Basta você consultar o catalogo e gerar comandos SQL para atualizar
**todas** as sequências com o maior valor de cada coluna:
SELECT 'SELECT setval('||serialseq||', max('||attname||')) FROM
'||tablename||';'
FROM (
SELECT
pg_get_serial_sequence(quote_ident(n.nspname)||'.'||quote_ident(r.relname),
a.attname) AS serialseq,
quote_ident(n.nspname)||'.'||quote_ident(r.relname) AS tablename,
quote_ident(a.attname) AS attname
FROM pg_class r
INNER JOIN pg_namespace n ON r.relnamespace = n.oid
INNER JOIN pg_attribute a ON a.attrelid = r.oid
WHERE r.relkind = 'r' AND NOT a.attisdropped
) t
WHERE t.serialseq IS NOT NULL;
Isso irá gerar os comandos para chamar o setval, basta copiá-los e
executá-los, ou usar funções para isso, como a exec em [1].
Agora, se as sequências não estão associadas às colunas, a coisa fica um
pouco mais complicada. É possível (e até fácil) fazer "parseando" o DEFAULT
das colunas, mas não é muito confiável.
[1] http://wiki.postgresql.org/wiki/Dynamic_DDL
Atenciosamente,
--
Matheus de Oliveira
Analista de Banco de Dados
Dextra Sistemas - MPS.Br nível F!
www.dextra.com.br/postgres
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral