Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Tylër

Auto incremento perdido após importar dados no DB2

Recommended Posts

Bom dia a todos.

 

Li uma matéria do Wagner Crivelini sobre colunas Identity e fiquei mais curioso ainda em tentar descobrir uma forma de resolver um problema em uma migração de dados para o banco DB2.

 

Estou migrando dados do MySQL para o DB2, utilizando um script feito em PHP para gerar as tabelas para o novo formato e importando os dados de tabelas exportadas do próprio MySQL. Seguindo as especificações da IBM:

 

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/t0004990.htm

 

O problema é que após importar os dados, o sistema em php conectado ao DB2 tenta inserir um registro de log com um INSERT sem passar o incremento junto e o DB2 acusa erro dizendo que já existe o valor "1".

 

A solução foi utilizar um comando SQL que restartasse o incremento manualmente da tablea de log e setasse um valor posterior ao último existente no banco:

Se eu tenho "1078" registros, então o incremento será de "1079"


ALTER TABLE log_acesso ALTER COLUMN id_acesso RESTART WITH 1079

 

Conversei com o Wagner e ele me disse para gerar um script com esse SQL que restartasse todas as tabelas e eu executar após a importação dos dados.

 

Daí vem um problema maior ainda.. Tem mais gente na equipe com suas bases, cada um com mais registros que o outro, pois trabalham em atividades separadamente e alguns possuem mais dados que os outros, então também teriam que rodar este script.

 

O processo aqui é automatizar essa conversão. Então busco com vocês uma solução que pudéssemos pensar em importar os dados mas o incremento não fosse "perdido" pelo DB2.

 

O script gera tabelas nesse formato:

CREATE TABLE "LOG_ACESSO" (
	"IDACESSO" BIGINT NOT NULL  GENERATED BY DEFAULT AS IDENTITY (
		START WITH +1
		INCREMENT BY +1
		MINVALUE +1
		MAXVALUE +2147483647
		NO CYCLE
		CACHE 20
		NO ORDER
	),
	"USUARIOS_ID" BIGINT WITH DEFAULT NULL,
	"DATAHORA" TIMESTAMP WITH DEFAULT NULL,
	"IP" VARCHAR(15) WITH DEFAULT NULL,
	"SISTEMA" VARCHAR(50) WITH DEFAULT NULL,
	"DATAHORA_LOGOUT" TIMESTAMP WITH DEFAULT NULL,
	"RAMAL" INTEGER WITH DEFAULT NULL
);
ALTER TABLE "LOG_ACESSO" ADD PRIMARY KEY ("ID_ACESSO");

 

Agradeço qualquer sugestão que seja útil pensando em automatização ou script SQL que crie estas tabelas sem esta perda de incremento.

 

Att.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não tem como após migração checar as tabelas que contém identity e setar com o max +1 para o próximo?

Não me lembro a estrutura do DB2, mas eu acho que já fiz isso, inclusive em migrações para SQLServer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então, o que consegui fazer foi gerar um script via PHP que escrevesse pra mim um ALTER TABLE e restartasse o incremento da seguinte forma:

 

Digamos que tenho 249 registros.

ALTER TABLE nomedatabela ALTER COLUMN id_acao RESTART WITH 250 ;

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.