Арифметичне переповнення за запитом SELECT


9

Я стикався з арифметичним переповненням у простому операторі SELECT. Запит був, як показано нижче, наприклад

SELECT [SaleValue] FROM Sales

[SaleValue]був тип даних decimal(9,0)і не був обчисленим стовпцем.

Причина цього сталася через те, що якось стовпець мав рядок, де це поле зберігало значення GREATER, ніж вказаний тип даних, наприклад decimal(10,0).

Я міг заставити вибір лише для роботи, коли збільшив розмір стовпця. У відповідній таблиці є ще два екземпляри у двох інших стовпцях та рядках.

Як така ситуація була можливою? Як вперше було збережено значення поза діапазоном у стовпці?

Я використовую сервер Microsoft SQL + це основна таблиця, а не вид.


1
Єдиний можливий спосіб, з яким я можу примусити це статися, - це редагування системних таблиць через ЦАП - досить жорстокий процес, який, сподіваємось, хтось зможе сказати вам, якби це було зроблено з цією БД. Навіть тоді я не впевнений, що це взагалі вийде (або навіть можливо). Поза цим нам справді потрібен сценарій репро, щоб побачити цю ситуацію для себе, і я підозрюю, що створення, якщо це можливо, може зайняти роки експериментів.
Damien_The_Unbeliever

Ще гірше, що тільки що пам’ятаю, що 9/10 - це точка перерізу для розміру пам’яті decimal- a decimal(9,0)повинна займати 5 байт, decimal(10,0)9. Тому я думаю, що це менш ймовірно, що ви могли це зробити, редагуючи системні таблиці, оскільки у вас не буде правильний розмір пам’яті для даних у кожному рядку.
Damien_The_Unbeliever

1
@Damien_The_Unbeliever Поняття не маєш, як відтворити. Щоб зрозуміти, що сталося, мені знадобилася година. Бачити це було як побачити суху воду або холодну спеку. Чесно кажучи, це залишило мене в тупі.

Відповіді:


15

Це може статися декількома способами, наприклад, як описано в Усунення помилок DBCC 2570 в SQL Server 2005 та новіших версіях :

Неправильні або недоступні дані можуть бути збережені в базі даних SQL Server у більш ранніх версіях з наступних причин:

  • Неправильні дані були наявні у джерелі під час використання методів масової вставки, таких як утиліта bcp.
  • Недійсні дані передавались через дзвінки подій RPC, здійснені на SQL Server.
  • Інші потенційні причини пошкодження фізичних даних залишили значення стовпця недійсним.

Ця стаття містить багато корисної інформації з даної теми. Основи див. У документації DBCC CHECKDBта DATA_PURITYзокрема.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.