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

Robson Zambroti rlzambroti em gmail.com
Ter Jun 5 17:55:42 -03 2012


Eduardo,
Este erro ocorreu pois no execute block que eu lhe passei eu não atendei em
ver se o campo estava como not null ou não, pois para que o campo possa ser
chave primária obrigatoriamente tem que ser not null, sendo assim incluí
esta validação, segue novamente execute block.

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 RDB$RELATION_FIELDS.RDB$NULL_FLAG = 1    --- <=== validacao
not 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 16:20, Eduardo Belo <beloelogica em gmail.com> escreveu:

> Meu caro Robson, primeiramente agradeço pela boa vontade em ajudar.
>
> Veja bem, executando o seu código no IBExpert, deu a seguinte mensagem:
>
> This operation is not defined for system tables.
> unsuccessful metadata update.
> Column: ITEM not defined as NOT NULL - cannot be used in PRIMARY KEY
> constraint definition.
> Essa base vem de uma importação de tabelas Paradox, não tem relacionamento
> e os campos estão como NULL, então preciso antes de definir esses indices,
> corrigir esse problema em todos os campos chaves (ITEM) definindo como NOT
> NULL. Você pode me ajudar mais uma vez?
>
> Obrigado.
>
> 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
> > ______________________________________________
> > 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
> >
> ______________________________________________
> 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



Mais detalhes sobre a lista de discussão lista