Introdução
A partir dos lançamentos do SQL Server 2012, quando a instância do SQL Server é reiniciada, o valor da coluna de crescimento automático da tabela salta e o valor específico do salto é determinado pelo tipo de dado da coluna de crescimento. Se o tipo de dado for int, o valor do salto é 1000, e se o tipo de dado for bigint, o valor do salto é 10000. No nosso projeto, esse tipo de problema de pulo é inaceitável, especialmente quando mostrado do lado do cliente. Esse problema estranho está presente apenas no SQL Server 2012 e posteriores, e não existe em versões anteriores ao SQL Server 2012.
fundo
Alguns dias atrás, um colega da nossa equipe de QA sugeriu: O valor da coluna auto-incrementante da nossa tabela disparou 10.000 inexplicavelmente. Em outras palavras, o último valor da coluna auto-incrementante em nossa tabela foi 2200, mas agora que adicionamos um novo registro, o valor da coluna auto-incrementada passou a ser 12200. Na nossa lógica de negócios, situações assim não são permitidas no cliente, então precisamos resolver esse problema.
Uso do código
No começo, todos nós éramos muito estranhos, como isso aconteceu? Normalmente não inserimos manualmente nenhum valor em colunas auto-incrementáveis (inserir manualmente valores em colunas auto-inflables é aceitável), e os valores das colunas auto-inflables são mantidos pelo próprio banco de dados. Um membro da nossa equipe principal começou a pesquisar essa questão e encontrou a resposta. Agora, gostaria de explicar esse problema em detalhes e a solução que meu colega encontrou.
Como reproduzir esse bug
Você precisará instalar o SQL Server 2012 e então criar um banco de dados de teste. Depois, crie uma tabela com colunas que crescem sozinhas:
Agora insira dois dados:
Revise os resultados:
Nesse ponto, o resultado foi o mesmo que esperávamos. Agora reinicie seu Serviço SQL Server. Existem várias maneiras de reiniciar o SQL Service, e aqui usamos o SQL Server Manager para reiniciá-lo:
Após reiniciar, inserimos mais 2 dados na tabela agora mesmo:
Revise os resultados:
Agora você vê os resultados após reiniciar o SQL Server 2012, e seus valores de coluna auto-incrementáveis começam em 1002. Ou seja, pulou 1000. Como mencionado anteriormente, se o tipo de dado que adicionarmos for bigint, seu valor de salto será 10.000.
Será que é realmente um BUG?
A Microsoft afirma que isso é um recurso, não um bug, e é útil em muitos cenários. Mas, no nosso caso, não precisamos dessa função, porque esses dados auto-incrementais são para serem mostrados aos clientes, e os clientes vão se sentir estranhos se virem dados tão rápidos. E o valor do salto é determinado pelo número de vezes que você reinicia o SQL Server. Se esses dados não forem mostrados aos clientes, podem ser aceitáveis. Portanto, esse recurso geralmente é adequado apenas para uso interno.
solução
Se não estamos interessados nesse "recurso" oferecido pela Microsoft, há duas formas de desativá-lo.
1. Uso de Sequências
2. Registrar o parâmetro de inicialização -t272 para SQL Server
Uso de sequências
Primeiro, precisamos remover as colunas auto-incrementáveis da tabela. Depois, crie uma sequência sem cache, da qual os valores numéricos são inseridos. Aqui está o código de exemplo:
Registre o parâmetro de inicialização -t272
Abra o Gerenciador de Configuração do SQL Server. Selecione sua instância do SQL Server 2012, clique com o botão direito e selecione o menu Propriedades. Encontre os parâmetros de lançamento na janela pop-up e registre -t272. Após a conclusão, reinicie o SQL Server (SQLSERVER2012) na figura abaixo e então execute a operação de reprodução de bugs para verificar se o problema foi resolvido.
Notas adicionais:
Se você tem muitas tabelas autoinflables no seu banco de dados e todas têm problemas de salto numérico, então é melhor usar a segunda opção. Porque é muito simples e o escopo é em nível de servidor. Adotar a segunda solução afetará todos os bancos de dados nesta instância de serviço.
|