[firebase-br] Criar campo chave para diversas tabelas em um único comando

Robson Zambroti rlzambroti em gmail.com
Ter Jun 5 13:15:13 -03 2012


Quando a alteração do campo o melhor que consegui (no curto tempo do
almoço) foi gerar um script para sua necessidade, veja abaixo:

EXECUTE BLOCK (NOME_CAMPO VARCHAR(30) = :NOME_CAMPO, NOVO_TIPO VARCHAR(100)
= :NOVO_TIPO, TIPO_ATUAL INTEGER = :TIPO_ATUAL)
            -- NOME DO CAMPO A SER ALTERADO        | NOVO TIPO EX.
NUMERIC(10,2)        |  TIPO ATUAL 27 = DOUBLE PRECISION
RETURNS (P_SQL VARCHAR(1500))
AS
DECLARE VARIABLE V_TABLE VARCHAR(30);
BEGIN
  P_SQL = '';
  FOR
      SELECT
            TRIM(RDB$RELATION_FIELDS.RDB$RELATION_NAME)
       FROM RDB$RELATION_FIELDS
       LEFT JOIN RDB$FIELDS ON RDB$FIELDS.RDB$FIELD_NAME =
RDB$RELATION_FIELDS.RDB$FIELD_SOURCE
      WHERE RDB$FIELDS.RDB$FIELD_TYPE          = :TIPO_ATUAL
        AND RDB$RELATION_FIELDS.RDB$FIELD_NAME = :NOME_CAMPO
        AND NOT(RDB$RELATION_FIELDS.RDB$RELATION_NAME LIKE 'RDB$%')
       INTO :V_TABLE
  DO
  BEGIN
    P_SQL = 'ALTER TABLE '||:V_TABLE||' ADD CAMPO_TMP '||:NOVO_TIPO||';';
    P_SQL = :P_SQL||ASCII_CHAR(13)||
            'UPDATE '||:V_TABLE||' SET CAMPO_TMP = '||:NOME_CAMPO||';';
    P_SQL = :P_SQL||ASCII_CHAR(13)||
            'ALTER TABLE '||:V_TABLE||' DROP '||:NOME_CAMPO||';';
    P_SQL = :P_SQL||ASCII_CHAR(13)||
            'ALTER TABLE '||:V_TABLE||' ADD '||:NOME_CAMPO||'
'||:NOVO_TIPO||';';
    P_SQL = :P_SQL||ASCII_CHAR(13)||
            'UPDATE '||:V_TABLE||' SET '||:NOME_CAMPO||' = CAMPO_TMP;';
    P_SQL = :P_SQL||ASCII_CHAR(13)||
            'ALTER TABLE '||:V_TABLE||' DROP CAMPO_TMP;';
    SUSPEND;
  END
END


Este execute block gera um script ai você precisa executar depois.
Espero ter ajudado.
Att.
Robson Zambroti

Em 5 de junho de 2012 12:30, Robson Zambroti <rlzambroti em gmail.com>escreveu:

> Eduardo,
> Tente assim (obs. testado no FB2.5):
>
> EXECUTE BLOCK
> AS
> DECLARE VARIABLE SQL VARCHAR(1500);
> BEGIN
>   FOR
>       SELECT DISTINCT
>              'ALTER TABLE '||
>              TRIM(RDB$RELATION_FIELDS.RDB$RELATION_NAME)||
>              ' ADD CONSTRAINT PK_'||
>              TRIM(RDB$RELATION_FIELDS.RDB$RELATION_NAME)||
>              ' PRIMARY KEY
> ('||TRIM(RDB$RELATION_FIELDS.RDB$FIELD_NAME)||');'
>         FROM RDB$RELATION_FIELDS
>        WHERE RDB$RELATION_FIELDS.RDB$FIELD_NAME = 'ITEM'
>          AND RDB$RELATION_FIELDS.RDB$VIEW_CONTEXT IS NULL
>          AND NOT EXISTS ( SELECT NULL
>                             FROM RDB$RELATION_CONSTRAINTS,
> RDB$INDEX_SEGMENTS
>                            WHERE
> RDB$RELATION_CONSTRAINTS.RDB$CONSTRAINT_TYPE = 'PRIMARY KEY'
>                              AND RDB$INDEX_SEGMENTS.RDB$FIELD_NAME =
> RDB$RELATION_FIELDS.RDB$FIELD_NAME
>                              AND
> RDB$RELATION_CONSTRAINTS.RDB$RELATION_NAME =
> RDB$RELATION_FIELDS.RDB$RELATION_NAME
>                              AND RDB$RELATION_CONSTRAINTS.RDB$INDEX_NAME =
> RDB$INDEX_SEGMENTS.RDB$INDEX_NAME  )
>         INTO :SQL
>   DO
>   BEGIN
>     EXECUTE STATEMENT SQL;
>   END
> END
>
> Att
> Robson Zambroti
>
> Em 5 de junho de 2012 12:10, Eduardo Belo <beloelogica em gmail.com>escreveu:
>
> Prezados,
>>
>>
>> Tem como criar um script  único afim de criar uma chave primaria para
>> todas
>> as tabelas de uma vez só? Todas as tabelas em comum tem o campo chave
>> "ITEM". A questão é que são 5 bases e todas em média tem cerca de 100
>> tabelas, pela lógica teria que fazer isso manualmente uma a uma, tipo:
>> ALTER TABLE CLIENTE ADD CONSTRAINT PK_CLIENTE PRIMARY KEY (ITEM).
>>
>> Tem como fazer isso de uam vez só afim de facilitar a manutenção?
>>
>>
>> A mesma pergunta faço para alterar de uma vez só um determinado tipo de
>> campo de todas as tabelas, exemplo: alterar todas as tabelas que tem o
>> campo tipo DOUBLE PRECISION para NUMERIC(15,2) ?
>>
>>
>>
>> Agradeço antecipadamente a todos que ajudarem.
>>
>>
>>
>> Eduardo Belo
>> ______________________________________________
>> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
>> Para saber como gerenciar/excluir seu cadastro na lista, use:
>> http://www.firebase.com.br/fb/artigo.php?id=1107
>> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>>
>
>
>
> --
> Att.
> Robson Zambroti
>
>


-- 
Att.
Robson Zambroti



Mais detalhes sobre a lista de discussão lista