Il est possible que IDENTITY_INSERT ne puisse être défini sur ON que dans une table de base de données à la fois, mais pourquoi? Étant donné que les IDENTITY
colonnes ne sont pas uniques au monde, je ne peux penser à aucune situation dangereuse qui pourrait être causée par l'insertion d'identités dans plus d'une table en même temps (au moins pas plus dangereux que le fudging général avec IDENTITY INSERT).
L'IDENTIFICATION INSERT doit être rarement utilisée, mais quelle est la raison de la limite stricte?
sql-server
Ben Brocka
la source
la source
Réponses:
Je pense que c'est pour le rendre difficile. Si vous pouviez simplement le laisser allumé tout le temps, pourquoi même avoir un champ d'identité?
Il existe cependant quelques restrictions:
Sur la base des restrictions liées à la connexion, je pense que c'est principalement pour qu'il ne soit jamais accidentellement laissé sous tension.
Imaginez si quelqu'un a activé l'insertion d'ID sur l'une de vos tables, alors vous ne vous en êtes pas rendu compte et une insertion (normalement) non valide a été effectuée qui a brisé l'intégrité de votre champ ID?
Gardez à l'esprit que les champs ID peuvent avoir des valeurs en double s'il n'y a pas de contrainte ou d'index unique en place ...
la source
IDENTITY
cela devient également une contrainte unique. Très facile à réfuter, bien sûr, s'ils pensent essayer.Je suppose que c'était une restriction en raison de la mise en œuvre. Autoriser ce paramètre sur plusieurs tables était un succès potentiel:
Puisqu'il s'agit d'un paramètre de session, permettre au paramètre d'être activé sur une seule table signifie qu'il s'agit d'un simple indicateur et de l'ID d'objet de la table à stocker sur la session, côté serveur. Peut-être que ce n'est qu'un seul entier: 0 si aucun IDENTITY_INSERT n'est actif, et un certain codage de databaseid + objectid pour la table.
Autoriser le paramètre à être défini sur plusieurs tables dans une session signifierait que le serveur stockerait une liste dynamique de ces objets et la vérifierait pour chaque instruction d'insertion. Imaginez qu'une session active le paramètre pour mille tables:
Je soupçonne également que l'activation de identity_insert a un impact sur les performances sur le serveur. Dans sybase, il y avait un " facteur de définition de la gravure d'identité ", qui permettait de sauvegarder la valeur du compteur d'identité d'une table à sauvegarder une fois de temps en temps (la valeur est conservée en mémoire et écrite sur le disque de temps en temps et sur le serveur fermer ). SQL Server est basé sur le même code et a donc probablement une optimisation comparable, mais l'activation de identity_insert sur une table contraint probablement le serveur à enregistrer la valeur d'identité pour chaque insertion, car sinon il ne peut pas garantir une taille d'écart maximale. Donc, si une session fait un hit de performance sur les insertions dans une table, cela est probablement acceptable, mais pas si elle peut faire le hit de performance sur toutes les tables auto_increment sur le serveur.
la source
INSERT
peut avoir lieu à la fois pour une session, et je pourrais facilement insérer 10 millions deIDENTITY
valeurs codées en dur .SET IDENTITY_INSERT
est activé? Je suggère simplement que la taille de l'écart n'affecte pas plusieurs tables différemment de ce qu'elle affecte une seule table.