quinta-feira, 9 de outubro de 2014

SQLServer 2008 - Reset do valor de uma sequência de uma campo Entity

Por vezes, quer por questões de migração de dados, updates ou outros casos, é preciso redefinir ou alterar o valor atual do gerador de números sequênciais para um determinada coluna de uma tabela numa Base de Dados. No caso do SqlServer 2008, não existe o conceito de SEQUENCE tal como em outras BDs (Oracle, etc...), mas existe algo minimamente equivalente que é o tipo Entity atribuído a uma única coluna da tabela em questão. O facto de só poder existir uma coluna/campo com o tipo Entity, acrescido do facto de não se poderem manipular as sequencias isoladamente como um objecto normal da BD, são as maiores diferenças desta implementação face a outras BDs. Assim, sendo como fazer, quando se quer alterar a sequência (o próximo id/Entity) a ser gerado ?
DBCC CHECKIDENT( 'nome_do_schema.nome_da_tabela', reseed, novo_numero_de_sequencia );
Se quisermos por exemplo fazer reset da sequência de forma ao próximo registo inserido ter a coluna/campo Entity com o valor 10000, deveremos executar o comando, de forma a configurar a sequência para o número anterior, dado que a sequência guarda o último número gerado, gerando o seguinte a partir desse mais o incremento definido. NOTA: Ter atenção nos casos em que o incremento da sequência não foi definido como 1, pois ai o próximo número será o número guardado na sequência mais o incremento definido. Assumindo então um schema com o nome "schema_teste" e uma tabela de nome "tabela_teste", para uma nova sequência da coluna/campo entity a começar em 10000, executariamos o seguinte comando.
DBCC CHECKIDENT( 'schema_teste.tabela_teste', reseed, 9999 );
AVISO: Obviamente, se uma sequência for alterada de forma a que possa gerar IDs idênticos a registos que já existam, irão surgir erros relativos à UNIQUE CONSTRAINT que é definida implicitamente para uma coluna/campo do tipo Identity. Habitualmente aumenta-se o número da sequência, e só em casos especiais se reduz, devido a necessidade de garantir a unicidade do identificador (Identity).

Sem comentários: