[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