2009-07-20 9 views
0

Ich habe eine Tabelle mit einer Identity-Spalte als Primärschlüssel.Identität Spalte nicht synchron

Alles ist gut, bis vor ein paar Tagen, Anwendung, die diese Tabelle verwendet beginnt Beschwerde über PK Verletzung. Zuerst dachte ich, das sei unmöglich, bis ich mich an DBCC CHECKIDENT erinnere. Die magische Funktion sagte mir, dass der 'aktuelle Spaltenwert' höher ist als 'aktueller Identitätswert'. Ich RESEED auf den höchsten Wert und alles schien wieder gut.

Meine Frage ist, um zu verhindern, dass dies in der Zukunft wieder passiert, was sind die möglichen Ursachen für dieses Problem nicht synchron? Und wie kann man das verhindern?

Antwort

3

Es klingt, als müssten Sie Ihren Code suchen, um Instanzen zu finden, in denen IDENTITY_INSERT aktiviert ist, und dann wird ein Schlüssel (wahrscheinlich eine hoch nummerierte Identspalte) eingefügt. Ihre Anwendung hat wahrscheinlich in der Vergangenheit Glück gehabt, dass der eingefügte (und willkürliche) PK-Wert innerhalb des Seed-Wertes liegt - wahrscheinlich aufgrund von Löschungen und ähnlichem.

+0

Wir haben nur einen Einfügepunkt durch eine gespeicherte Prozedur. Aber ja, das hält die Leute nicht davon ab, sich einzuloggen und die Werte über SSMS zu ändern, indem IDENTITY_INSERT verwendet wird. +1, danke! –

+0

aber .. aber .. kein Entwickler würde jemals so etwas machen, oder? Sag es nicht so! :) Wenn Sie Migrations-ETL-Skripts haben, die als Teil einer Bereitstellung ausgeführt werden, sollten Sie diese auch überprüfen, da gelegentlich Explicity-Ident-Werte benötigt werden. –

+0

Nicht explizit. Wie deaktiviere ich die Möglichkeit, IDENTITY_INSERT einzuschalten? Irgendeine Idee? –

0

Die Identitätsbeilage sollte in einer Produktionsumgebung nicht aktiviert werden, es sei denn, Sie führen planmäßige Wartungsarbeiten durch und befinden sich außerhalb der Spitzenzeiten im Einzelbenutzermodus. Es wirkt sich auf jeden aus, der versucht, einen Datensatz einzufügen (Ihr normaler Einfügeprozess führt zu einem Fehler, weil er die Identität nicht angibt), während er eingeschaltet ist, und seine Verwendung ist sehr schlecht! Wenn Sie Entwickler oder Prozesse in Ihrer Produktumgebung verwenden, müssen Sie Ihren Prozess sofort überdenken.

Entwickler sollten keine Produktionsrechte haben, und nur dieser Schritt kann eine zukünftige Wiederbelegung Ihres Problems verhindern, da ein dba die Anzeige eines identity-Inserts ohne Nachdenken darüber, was es beeinflussen würde, nicht erlauben würde. Ich stimme Josh zu, überprüfe alle ETL-Importe, die ausgeführt werden, suche insbesondere nach einer, die ungefähr zu der Zeit lief, als das Problem begann.

Wenn Entwickler Identitätswerte ändern oder Identität einfügen, müssen Sie sie darüber informieren, warum dies eine sehr schlechte Praxis ist. Identitätswerte sollten nach dem Einfügen nicht mehr geändert werden, da dies auch alle zugehörigen Tabellen betrifft.

+0

Ich habe nicht gesagt, dass jemand regelmäßig etwas eingefügt hat, aber das ist eine Möglichkeit. Anders als IDENTITY_INSERT, eine andere Ursache für das Problem? –

Verwandte Themen