Ce problème est encore très courant chez de nombreux développeurs et applications, quelle que soit leur taille.
Malheureusement, les suggestions ci-dessus ne résolvent pas tous les scénarios, c'est-à-dire qu'en cas d'hébergement partagé, vous ne pouvez pas compter sur votre hôte pour définir le paramètre de démarrage -t272.
De plus, si vous avez des tables existantes qui utilisent ces colonnes d'identité comme clés primaires, cela représente un énorme effort de supprimer ces colonnes et d'en recréer de nouvelles pour utiliser la solution de contournement de la séquence BS. La solution de la séquence n'est valable que si vous concevez les tables à partir de zéro dans SQL 2012+.
En résumé, si vous utilisez Sql Server 2008R2, restez-le. Sérieusement, restez-y. Jusqu'à ce que Microsoft admette qu'ils ont introduit un énorme bug, qui est toujours là même dans Sql Server 2016, alors nous ne devrions pas mettre à niveau jusqu'à ce qu'ils l'assument et le corrigent.
Microsoft a carrément introduit un changement de rupture, c'est-à-dire qu'ils ont cassé une API qui ne fonctionne plus comme prévu, du fait que leur système oublie l'identité actuelle lors d'un redémarrage. Cache ou pas, c'est inacceptable, et le développeur de Microsoft du nom de Bryan doit l'assumer, au lieu de dire au monde que c'est "par conception" et une "fonctionnalité". Bien sûr, la mise en cache est une fonctionnalité, mais perdre la trace de ce que la prochaine identité devrait être, N'EST PAS UNE FONCTION. C'est un putain de BUG ! !!
Je vais partager la solution de contournement que j'ai utilisée, parce que mes bases de données sont sur des serveurs d'hébergement partagé, et aussi parce que je ne vais pas supprimer et recréer mes colonnes de clés primaires, ce qui serait un énorme problème.
Au lieu de cela, voici mon hack honteux (mais pas aussi honteux que ce bug POS que microsoft a introduit).
Hack/Fix :
Avant vos commandes d'insertion, il suffit de réensemencer votre identité avant chaque insertion. Ce correctif n'est recommandé que si vous n'avez pas le contrôle administratif de votre instance Sql Server, sinon je suggère de réensemencer au redémarrage du serveur.
declare @newId int -- where int is the datatype of your PKey or Id column
select @newId = max(YourBuggedIdColumn) from YOUR_TABLE_NAME
DBCC CheckIdent('YOUR_TABLE_NAME', RESEED, @newId)
Il suffit d'ajouter ces trois lignes juste avant l'insertion, et tout devrait bien se passer. Cela n'affectera pas vraiment les performances, c'est-à-dire que cela ne sera pas perceptible.
Goodluck.