Jest tak, że IDENTITY_INSERT można ustawić na ON tylko w jednej tabeli bazy danych na raz, ale dlaczego? Ponieważ IDENTITY
kolumny nie są globalnie unikatowe, nie mogę wymyślić żadnej niebezpiecznej sytuacji, która mogłaby być spowodowana wstawieniem tożsamości do więcej niż jednej tabeli w tym samym czasie (przynajmniej nie bardziej niebezpieczna niż ogólnie fudowanie z WSTAWKĄ TOŻSAMOŚCI).
WSTAWKA TOŻSAMOŚCI powinna być rzadko używana, ale jaki jest powód sztywnego limitu?
sql-server
Ben Brocka
źródło
źródło
Odpowiedzi:
Myślę, że to utrudnia. Jeśli możesz pozostawić to cały czas włączone, to po co w ogóle mieć pole tożsamości?
Istnieje jednak kilka ograniczeń:
W oparciu o ograniczenia związane z połączeniem, myślę, że jest to głównie dlatego nigdy nie zostaje przypadkowo WŁĄCZONE.
Wyobraź sobie, że jeśli ktoś włączył wstawkę identyfikacyjną na jednej z twoich tabel, nie zdawałeś sobie sprawy i wykonano (normalnie) nieprawidłową wstawkę, która złamała integralność twojego pola identyfikacyjnego?
Pamiętaj, że pola ID mogą mieć zduplikowane wartości, jeśli nie ma ograniczenia lub unikalnego indeksu ...
źródło
IDENTITY
to również wyjątkowym ograniczeniem. Oczywiście bardzo łatwo je obalić, jeśli spróbują.Domyślam się, że było to ograniczenie ze względu na wdrożenie. Dopuszczenie tego ustawienia na wielu stołach było potencjalnym hitem wydajności:
Ponieważ jest to parametr sesji, zezwolenie na aktywację ustawienia w pojedynczej tabeli oznacza, że jest to prosta flaga i identyfikator obiektu tabeli do przechowywania w sesji po stronie serwera. Może to tylko jedna liczba całkowita: 0, jeśli nie jest aktywne IDENTITY_INSERT, i pewne kodowanie databaseid + objectid dla tabeli.
Zezwolenie na ustawienie parametru w wielu tabelach w ramach sesji oznaczałoby, że serwer przechowywałby dynamiczną listę takich obiektów i sprawdzałby ją dla każdej instrukcji insert. Wyobraź sobie, że sesja aktywuje parametr tysiąca tabel:
Podejrzewam również, że ustawienie Włożona tożsamość ma wpływ na wydajność na serwerze. W sybase istniał „ współczynnik nagrywania tożsamości ”, który pozwalał na zapisanie wartości licznika tożsamości tabeli, która ma być zapisywana tylko raz na jakiś czas (wartość jest przechowywana w pamięci i zapisywana na dysk raz na jakiś czas i na serwerze zamknąć ). Program SQL Server jest oparty na tym samym kodzie, więc prawdopodobnie ma pewną porównywalną optymalizację, ale aktywacja identy- fikacji_wstawienia w tabeli prawdopodobnie ogranicza serwer do zapisywania wartości tożsamości dla każdej wstawki, ponieważ w przeciwnym razie nie może zagwarantować maksymalnego rozmiaru przerwy. Więc jeśli jedna sesja spowoduje poprawę wydajności na wstawkach w jednej tabeli, jest to prawdopodobnie dopuszczalne, ale nie, jeśli może sprawić, że perf trafi we wszystkie tabele auto_increment na serwerze ..
źródło
INSERT
może być wykonywana jednocześnie na sesję, i z łatwością mogę wstawić 10 milionówIDENTITY
wartości zakodowanych na stałe.SET IDENTITY_INSERT
jest włączony? Po prostu sugeruję, że rozmiar luki nie wpływa na wiele tabel inaczej niż na pojedynczą tabelę.