Que faites-vous lorsque votre key primaire déborde?

Nous avons une table, avec une key primaire auto-increment int , dont la valeur max est maintenant à la limite pour le type int T-SQL. Lorsque nous essayons de ré-ensemencer la table (car il y a de grands espaces dans les keys, pas assez près de la valeur max. int ), cela continue à se réinitialiser à la valeur max int .

Évidemment, cela cause de sérieux problèmes. Le PK n'aurait jamais dû atteindre cette valeur et changer le type de données serait une grosse tâche. Le ré-ensemencement devrait être suffisant, mais ça ne marche pas!

Comment pourrait-il continuer à se réinitialiser?

Edit: pour clarifier la situation, cette requête SELECT MIN(CategoryID), MAX(CategoryID) FROM dbo.tblCategories renvoie -2147483647, 2147483647 … ce qui signifie qu'il existe des valeurs PK réelles aux min et max du type int .

Vous pouvez "réensemencer" une table afin que la colonne d'identité affectée suivante soit inférieure à la valeur max actuelle dans la table. Toutefois, tout sous-programme DBCC CHECKIDENT en cours réinitialisera le countur interne à la valeur maximale actuellement dans la colonne. Peut-être que c'est de là que vient la réinitialisation? Et bien sûr, un insert atteindra finalement une valeur en double, ce qui entraînera des time intéressants pour l'équipe de support de production.

En gros, vous êtes en difficulté. Je recommand de travailler sur un script à usage unique pour supprimer / réinitialiser les valeurs d'ID Uber-haut. La mise à jour des lignes (et de toutes les valeurs de key étrangère associées) est une option, bien que cela implique de devoir désactiver les contraintes de key étrangère et je ne sais pas quoi d'autre, donc je ne le reorderais pas. L'autre serait de créer des copys exactes de toutes datatables pour les éléments "high-id" en utilisant des valeurs Id plus pragmatiques, puis supprimer les inputs d'origine. C'est un hack, mais il en résulterait une database beaucoup plus maintenable.

Oh, et traquez les gens qui mettent ces valeurs d'identifiant élevé, et – à tout le less – révoquent leurs droits d'access à la database.

J'étais impliqué dans un projet qui avait un problème similaire – bien que dans notre cas, quelqu'un avait choisi un champ avec un nombre à 4 numbers comme key primaire, ce qui ne fonctionnait pas comme nous avons approché 9999 loggings …

Dans notre cas, nous avons créé une nouvelle colonne sur la table et rempli celle-ci, modifié la key primaire de cette colonne, et renvoyé toutes les relations de key étrangère vers la nouvelle key.

Très sale, mais ça a marché.

Créez une nouvelle table avec la même structure. Lire de l'ancien au nouveau (sauf pour PK). Puis supprimez l'ancien et renommez le nouveau.