Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Base de données SQL Windows Azure - La colonne d'incrémentation automatique d'identité ignore les valeurs

Vous n'aurez peut-être pas de chance ici si vous devez éliminer ces lacunes.

J'ai moi-même rencontré ce problème alors que je développais/testais une nouvelle application. J'ai l'intuition de ce qui se passe ici dans sql azur sur la base de ce que j'ai lu sur sql server 2012. Je n'ai trouvé aucune documentation à ce sujet pour sql azur.

D'après ce que j'ai lu, c'est une fonctionnalité qui apparaît comme un bogue IMO. Dans SQL Server 2012, Microsoft a ajouté la possibilité de créer des séquences. Les séquences enregistrent les valeurs utilisées par blocs de 1000. Supposons donc que votre séquence progresse... 1, 2, 3, 4, 5... puis votre serveur sql redémarre. Eh bien, la séquence a déjà enregistré le fait que le bloc 1-1000 a déjà été utilisé, donc il vous saute au prochain 1000.... donc votre prochaine valeur est 1001, 1002, 1003, 1004... s'insère lors de l'utilisation de séquences, mais peut entraîner des écarts inhabituels. Il existe une solution à cela pour votre séquence. Lors de la spécification de votre séquence, ajoutez le paramètre "NOCACHE" afin qu'il n'enregistre pas de blocs de 1000 à la fois. Voir ici pour plus de documentation.

Là où cela devient un problème, c'est que les colonnes d'identité semblent avoir été modifiées pour utiliser ce même paradigme. Ainsi, lorsque votre serveur, ou dans ce cas votre instance sql azure, redémarre, vous pouvez obtenir de grands écarts (1000) dans vos colonnes d'identité car il met en cache de gros blocs comme "utilisés". Il existe une solution à cela pour sql server 2012. Vous pouvez spécifier un indicateur de démarrage t272 pour rétablir votre identité à l'aide de l'ancien paradigme sql server 2008 r2. Le problème est que je ne sais pas (ce n'est peut-être pas possible) comment spécifier cela dans sql Azure. Impossible de trouver la documentation. Voir ce fil pour plus de détails sur sql server 2012.

Vérifiez la documentation d'identité ici dans le msdn. Plus précisément la section "Valeurs consécutives après le redémarrage du serveur ou d'autres échecs". Voici ce qu'il dit :

Donc, si vous avez besoin d'avoir des valeurs consécutives, vous pouvez essayer de spécifier une séquence avec nocache au lieu de vous fier à votre colonne d'identité. Je n'ai pas essayé moi-même, mais il semble que vous aurez du mal à faire fonctionner cela avec le framework d'entité.

Désolé si cela ne vous aide pas beaucoup, mais au moins c'est quelques informations sur ce que vous vivez.