[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