[firebase-br] Atualizar campo em todas as tabelas

Kelver Merlotti kmerlotti em gmail.com
Qui Jun 17 17:53:29 -03 2010


Fala galera, boa tarde! Pode ser que alguém se interesse e precise disso um dia!
Quando se tem um banco "anti-formas normais", sem fks muito menos
update cascade, e precisa-se trocar o id de um registro na tabela e em
todas as outras dependentes, pra não ter que fazer uma por uma na mão,
ou desenvolver algum pequeno programa pra isso, utilize esta
procedure:

CREATE OR ALTER PROCEDURE TROCA_CODIGO_TABELAS (
    novo varchar(5),
    velho varchar(5),
    campo varchar(20))
as
declare variable tabela varchar(25);
begin
  FOR SELECT RDB$RELATION_NAME FROM RDB$RELATION_FIELDS WHERE
    --RDB$RELATION_NAME NOT IN ('TABELA_EXCECAO1', 'TABELA_EXCECAO2') AND
    RDB$FIELD_NAME = :CAMPO INTO :TABELA DO
  BEGIN
    EXECUTE STATEMENT 'UPDATE ' || TABELA || ' SET ' ||
              :CAMPO || ' = ''' || :NOVO || ''' WHERE ' || +
              :CAMPO || ' = ''' || :VELHO || '''';
  END
end

Porém, essa SP exige que todas as tabelas possuam o mesmo nome de
campo, ou seja, se em CLIENTES o ID se chama CODCLI, em todas as
outras tabelas que fazem referencia à CLIENTES, o campo também deve-se
chamar CODCLI. Dessa forma, poderiamos fazer:

execute procedure('99999', '123', 'CODCLI');

A procedure vai repassar todas as tabelas do banco que possuem um
campo chamado CODCLI e executar o update trocando o valor de 123 para
99999.

Espero que seja útil.
Abraços!

Kelver Merlotti
Coordenador Editorial do Portal www.ActiveDelphi.com.br
Contato: kelver em activedelphi.com.br
Google: kmerlotti em gmail.com
Twitter: http://twitter.com/kmerlotti
Tem um segundo? Então, dá uma olhadinha nisso:
Um site de publicidades, de Portugal, está pagando em euros (quase 3x
mais que em reais) pra quem estiver disposto a:
 * Ler anúncios
 * Visitar sites
 * Clicar em banners
 * Navegar na NET
 * Ler e-mails
 * Convidar novos usuários
O pagamento pode ser feito de várias formas!
Registra lá. Não custa nada!!! ;-)
http://www.publipt.com/pages/index.php?refid=kmerlotti




Mais detalhes sobre a lista de discussão lista