2013/4/23 Marcelo da Silva <marc...@ig.com.br>

>
>
>
> Em 23 de abril de 2013 13:27, Flavio Henrique Araque Gurgel <
> fla...@4linux.com.br> escreveu:
>
>
>> Em 23-04-2013 13:25, Marcelo da Silva escreveu:
>>
>>  Bem, não é exatamente ao mesmo tempo, mas a ideia é a seguinte:
>>>
>>> No banco existem N tabelas com o campo "cod_id"
>>>
>>> Eu gostaria de fazer um update em todas as tabelas que possuem este
>>> cod_id par um mesmo numero, exemplo:
>>>
>>> update tabelaA set cod_id = X where cod_id = Y
>>> update tabelaB set cod_id = X where cod_id = Y
>>> update tabelaC set cod_id = X where cod_id = Y
>>> Etc
>>>
>>> Pra eu fazer isso tenho que ver todas as tabelas que tem este campo numa
>>> base de 200 tabelas pra depois fazer o Update em cada tabela.
>>>
>>> Será que podemos agilizar este processo com um update e where numa
>>> tabela do sistema ?
>>>
>>
>> Não.
>> Mas você pode fazer um script que lê as tabelas existentes e "monta" os
>> UPDATEs pra você.
>> Tudo depende de quantas vezes você terá que fazer isso.
>>
>> Pergunto: os campos cod_id tem o mesmo significado e são relacionados?
>> Por que se forem, você deve relacioná-los com uma chave estrangeira a uma
>> tabela que os contém como chave primária. Utilizando "ON UPDATE CASCADE",
>> você faz o UPDATE só uma vez na tabela referenciada e todas as outras serão
>> atualizadas automaticamente.
>>
>>
>>
> Pois é Flavio, até pensei num ForeignKey mas não fiz isso no começo, agora
> pra parar tudo e linkar esses campos não será nada facil.
> Vou ter que criar um while no sistema pra ler essas tabelas e automatizar
> essa alteração.
> Tenho que fazer isso porque alguns usuários cadastraram uma mesma empresa
> varias vezes com CPNJs diferentes (porque o cliente insistiu pra deixar o
> sistema aberto no inicio, sabe como é né)... agora tenho que solucionar o
> problema. Mas faz parte :)
>
>
Cara, eu diria pra você NÃO montar esse monte de UPDATE louco, e ao invés
disso corrigir o problema e adicionar uma tabela com o campo como chave
primária (como recomendado pelo Flávio). Sinceramente, 200 tabelas não é
tanto assim, e se a coisa está tão feia, talvez seja a hora de revisar todo
modelo.

MAS, para agora, você pode realizar consultas na tabela de catálogo
pg_attributes. Exemplo, para adicionar as FKs, você poderia fazer algo do
tipo:

SELECT
    'ALTER TABLE '||attrelid::regclass
    ||' ADD CONSTRAINT fk_cod_id FOREIGN KEY (cod_id) REFERENCES
tabela_cod_id (id) ON UPDATE CASCADE;'
FROM pg_attribute WHERE attname = 'bla';

Daí é só executar a consulta, copiar o resultado e re-executar. Com o psql
isso é fácil:

$ psql -Atf consulta.sql seu_banco | psql seu_banco

Claro que terás que inserir os dados corretos na tabela_cod_id antes, mas
você pode gerar o insert para isso da mesma forma.

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

Responder a