[firebase-br] Criar campo "Identity" em tabela com dados

Gladiston Santana gladiston em vidy.com.br
Ter Jun 11 09:13:31 -03 2019


Veja a instrução que passei para certo time de desenvolvimento quando eles
tiveram a mesma tarefa que a sua, e não quiseram usar mais sequenciadores,
mas o novo tipo identity.
Queira por gentileza adaptar as suas necessidades:
No fb a sequencia para adicionar um campo autoincremental a uma tabela com
dados existentes seguiria os seguintes passos.
Premissas:
  Tabela=produto_fabcomponentes,
  novo campo autoincremental=id_produto_fabcomponente

1. crie uma nova tabela com as mesmas definições da tabela anterior, porém
com o campo autoincremental:
CREATE TABLE PRODUTO_FABCOMPONENTES2 (
    ID_PRODUTO_FABCOMPONENTE   D_ROWID GENERATED BY DEFAULT AS IDENTITY
PRIMARY KEY, -- note que é autoincremental, d_rowid é bigint
    CODITEM_PRODUTO   D_CODIGO30,
    CODCOMPONENTE     D_CODIGO30,
    SEQ               D_SEQUENCIA_LONGA,
    QUANTIDADE       D_QUANTIDADE,
    UNIDADE           D_UNIDADE,
    COMENTARIO       D_COMENTARIO,
    CORTE_X_CM         D_VALOR2,
    CORTE_Y_CM         D_VALOR2,
    LAST_UPDATE       D_CURRENT_TIME,
    LAST_OWNER       D_CURRENT_USER
);

2. Vamos popular a primeira tabela com o conteudo da primeira.
Note que não vou mencionar ID_PRODUTO_FABCOMPONENTE por que esse valor nao
existia na tabela anterior e receberá valores novos.
Contudo se você já tinha esse campo e apenas não era autoincremental, você
deverá mencioná-lo.
insert into produto_fabcomponentes2 (
--    id_produto_fabcomponente,
  coditem_produto,
  codcomponente,
  seq,
  quantidade,
  unidade,
  comentario,
  corte_x_cm,
  corte_y_cm,
  last_update,
  last_owner)
select
--    id_produto_fabcomponente,
  coditem_produto,
  codcomponente,
  seq,
  quantidade,
  unidade,
  comentario,
  corte_x_cm,
  corte_y_cm,
  last_update,
  last_owner
from produto_fabcomponentes
order by coditem_produto, codcomponente

3. confere se ambas as tabelas tem os mesmos resultados
select
  (select count(*) from PRODUTO_FABCOMPONENTES) as count1,
  (select count(*) from PRODUTO_FABCOMPONENTES2) as count2
from rdb$database

4. Na tabela antiga PRODUTO_FABCOMPONENTES, apague qualquer dependencia
antes de prosseguir.
   Se a dependencia for uma SP, tente comentar as linhas.

5. Se ambas tem os mesmos resultados, apague a tabela antiga:
  DROP TABLE PRODUTO_FABCOMPONENTES;

6. Recrie-a novamente com o conteudo da nova:
CREATE TABLE PRODUTO_FABCOMPONENTES (
    ID_PRODUTO_FABCOMPONENTE   D_ROWID GENERATED BY DEFAULT AS IDENTITY
PRIMARY KEY,
    CODITEM_PRODUTO   D_CODIGO30,
    CODCOMPONENTE     D_CODIGO30,
    SEQ               D_SEQUENCIA_LONGA,
    QUANTIDADE       D_QUANTIDADE,
    UNIDADE           D_UNIDADE,
    COMENTARIO       D_COMENTARIO,
    CORTE_X_CM         D_VALOR2,
    CORTE_Y_CM         D_VALOR2,
    LAST_UPDATE       D_CURRENT_TIME,
    LAST_OWNER       D_CURRENT_USER
);

7. Popule-a novamente, dessa vez note que o campo identity não está
comentado porque queremos aproveitar a sequencia anterior:
insert into produto_fabcomponentes (
  id_produto_fabcomponente,   -- agora o autoincremento será reaproveitado
  coditem_produto,
  codcomponente,
  seq,
  quantidade,
  unidade,
  comentario,
  corte_x_cm,
  corte_y_cm,
  last_update,
  last_owner)
select
  id_produto_fabcomponente,
  coditem_produto,
  codcomponente,
  seq,
  quantidade,
  unidade,
  comentario,
  corte_x_cm,
  corte_y_cm,
  last_update,
  last_owner
from produto_fabcomponentes2

8. confere se ambas as tabelas tem os mesmos resultados
select
  (select count(*) from PRODUTO_FABCOMPONENTES) as count1,
  (select count(*) from PRODUTO_FABCOMPONENTES2) as count2
from rdb$database

9. CORRIGIR O PROXIMO NUMERO DA SEQUENCIA:
SELECT MAX(ID_produto_fabcomponente)+1 AS NOVO_NUMERO
FROM produto_fabcomponentes;

10. A tabela nova recebeu valores de id_produto_fabcomponente que eram
literais,
por isso o autoincremento nessa tabela ainda está virgem e comecará com 1,
daí precisamos que ele reinicie no proximo numero, supondo que no passo
anterior o novo_numero seja 1998:
ALTER TABLE produto_fabcomponentes
  ALTER COLUMN id_produto_fabcomponente restart with 1998;

Em dom, 9 de jun de 2019 às 19:02, Siro <siro em protej.com.br> escreveu:

> Estou tentando migrar do fb 2.5 para o 3.0 e me deparei com problemas
> para criação de campos Identity.
>
> Não obtive sucesso quando a tabela já possui dados. Utilizo o comando
> abaixo:
>
> ALTER TABLE "(TABELA)" ADD ID INTEGER GENERATED BY DEFAULT AS IDENTITY
>
> Se a tabela se encontra sem dados o campo é criado normalmente.
>
> Fiz varias pesquisas (dentro do meu alcance) buscando informações que
> pudessem me auxiliar, mas não obtive sucesso.
>
> Alguém poderia me orientar se é possível criar campos do tipo IDENTITY
> em tabelas que já estejam povoadas?
>
> O objetivo e deixar de utilizar "Triggers e Sequence" em  campos PK no
> Fb 3.0.
>
> Desde já agradeço
>
>
>
> ______________________________________________
> 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://www.firebase.com.br/pesquisa_lista.html
>


-- 
A Vidy possui um Sistema de Gestão da Qualidade estruturado e com
Certificação ISO 9001 há mais de 10 anos, mantendo seu foco na Qualidade e
na Melhoria Continua.

Em março de2018 migramos com sucesso para a nova versão da ISO 9001.

Somos a única Empresa Brasileira de Engenharia de Laboratórios com
certificação com o Escopo Completo; desde Projetos, Engenharia, Construção,
Fabricação e Instalação de Laboratórios.



Mais detalhes sobre a lista de discussão lista