Przepełnienie arytmetyczne w zapytaniu SELECT

9

W prostej instrukcji SELECT napotkałem przepełnienie arytmetyczne. Zapytanie było jak poniżej, np

SELECT [SaleValue] FROM Sales

[SaleValue]miał typ danych, decimal(9,0)a nie kolumnę obliczeniową.

Powodem tego było to, że jakoś kolumna miała wiersz, w którym to pole zapisywało wartość WIELKĄ niż określony typ danych, np decimal(10,0).

Mogłem sprawić, by zaznaczenie działało tylko wtedy, gdy zwiększyłem rozmiar kolumny. Ta tabela ma dwa inne wystąpienia w dwóch innych kolumnach i wierszach.

Jak to możliwe? Jak w pierwszej kolejności zapisano wartość spoza zakresu w kolumnie?

Używam serwera Microsoft SQL + to jest tabela podstawowa, a nie widok.


źródło
1
Jedynym możliwym sposobem wymuszenia tego może być edytowanie tabel systemowych za pomocą DAC - dość gwałtowny proces, o którym ktoś mógłby powiedzieć, gdyby został zrobiony z tym DB. Nawet wtedy nie jestem pewien, czy to w ogóle zadziała (a nawet będzie możliwe). Poza tym naprawdę potrzebujemy skryptu repro, aby zobaczyć tę sytuację dla siebie i podejrzewam, że utworzenie repro, jeśli to możliwe, może z łatwością zająć lata eksperymentów.
Damien_The_Unbeliever
Co gorsza, właśnie pamiętam, że 9/10 to punkt przejścia dla wielkości pamięci decimal- a decimal(9,0)powinien zajmować 5 bajtów, a decimal(10,0)9. Więc myślę, że jest mniej prawdopodobne, że możesz to zrobić poprzez edycję tabel systemowych, ponieważ nie będziesz miał prawidłowy rozmiar pamięci dla danych w każdym wierszu.
Damien_The_Unbeliever
1
@Damien_The_Unbeliever Nie masz pojęcia, jak się rozmnażać. Zrozumienie, co się stało, zajęło mi godzinę. Widzieć to było jak widzenie suchej wody lub zimnego ciepła. Szczerze mówiąc, to mnie zaskoczyło.

Odpowiedzi:

15

Może się to zdarzyć na kilka sposobów, na przykład zgodnie z opisem w Rozwiązywanie problemów z błędem DBCC 2570 w SQL Server 2005 i późniejszych wersjach :

Nieprawidłowe lub spoza zakresu dane mogły być przechowywane w bazie danych SQL Server we wcześniejszych wersjach z następujących powodów:

  • Niepoprawne dane były obecne w źródle podczas korzystania z metod wstawiania zbiorczego, takich jak narzędzie bcp.
  • Nieprawidłowe dane zostały przekazane przez wywołania zdarzeń RPC do programu SQL Server.
  • Inne potencjalne przyczyny fizycznego uszkodzenia danych spowodowały, że wartość kolumny była niepoprawna.

Ten artykuł zawiera wiele przydatnych informacji na ten temat. Dla podstaw, zapoznać się z dokumentacją DBCC CHECKDBoraz DATA_PURITYopcję w szczególności.

Paul White 9
źródło