Este artigo é um artigo espelhado de tradução automática, por favor clique aqui para ir para o artigo original.

Vista: 12359|Resposta: 1

[Fonte] Colunas de crescimento automático do SQL Server 2012 com problemas de salto de valor

[Copiar link]
Publicado em 23/08/2018 12:03:06 | | | |
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.





Anterior:O servidor web retorna o tipo e significado do código de status
Próximo:Atualize o método operacional da coluna ID auto-crescente no banco de dados SQL Server
 Senhorio| Publicado em 08/07/2020 15:15:52 |
O SQL Server funciona em versões mais altas. Ele "armazena" em cache 1000 valores de identificação inicialmente por razões de desempenho
Disclaimer:
Todo software, material de programação ou artigos publicados pela Code Farmer Network são apenas para fins de aprendizado e pesquisa; O conteúdo acima não deve ser usado para fins comerciais ou ilegais, caso contrário, os usuários terão todas as consequências. As informações deste site vêm da Internet, e disputas de direitos autorais não têm nada a ver com este site. Você deve deletar completamente o conteúdo acima do seu computador em até 24 horas após o download. Se você gosta do programa, por favor, apoie um software genuíno, compre o registro e obtenha serviços genuínos melhores. Se houver qualquer infração, por favor, entre em contato conosco por e-mail.

Mail To:help@itsvse.com