Эта статья является зеркальной статьёй машинного перевода, пожалуйста, нажмите здесь, чтобы перейти к оригиналу.

Вид: 12670|Ответ: 1

[Источник] В SQL Server 2012 столбцы автоматического увеличения с проблемами прыжка значения

[Скопировать ссылку]
Опубликовано 23.08.2018 12:03:06 | | | |
Знакомство

Начиная с релизов SQL Server 2012, при перезагрузке экземпляра SQL Server значение столбца автороста таблицы скачает, а конкретное значение перехода определяется типом данных столбца роста. Если тип данных int, то значение прыжка равно 1000, а если тип данных bigint, то значение прыжка — 10000. С точки зрения нашего проекта, такая проблема прыжков неприемлема, особенно если это показано на стороне клиента. Эта странная проблема присутствует только в SQL Server 2012 и позже, и не существует в версиях до SQL Server 2012.


фон

Несколько дней назад коллега из нашей команды по контролю качества предположил: Стоимость столбца с самоувеличением нашей таблицы необъяснимо выросла на 10 000. Другими словами, последнее значение столбца самоувеличения в нашей таблице было 2200, но теперь, когда мы добавили новый рекорд, значение столбца с самоувеличением стало 12200. В нашей бизнес-логике такие ситуации не допускаются к клиенту, поэтому нам нужно решить эту проблему.


Использование кода

Сначала мы все были очень странны, как это произошло? Обычно мы не вставляем значения вручную в самоувеличивающиеся столбцы (ручное вставление значений в самонадувающиеся столбцы — это нормально), а значения самонадувающихся столбцов поддерживаются самой базой данных. Один из членов нашей основной команды начал изучать этот вопрос и нашёл ответ. Теперь я хотел бы подробно объяснить эту проблему и решение, которое нашёл мой коллега.


Как воспроизвести этот баг


Вам нужно будет установить SQL Server 2012, а затем создать тестовую базу данных. Затем создайте таблицу с саморастущими столбцами:
Теперь вставьте два фрагмента данных:

Ознакомьтесь с результатами:






На этом этапе результат оказался таким же, как мы и ожидали. Теперь перезапустите свой SQL Server Service. Существует несколько способов перезапустить SQL Service, и здесь мы используем SQL Server Manager для перезапуска:



После перезапуска мы только что вставляем в таблицу ещё 2 элемента данных:



Ознакомьтесь с результатами:




Теперь вы видите результаты после перезапуска SQL Server 2012, и значения столбцов с самоувеличением начинаются с 1002. То есть перепрыгнул на 1000. Как уже упоминалось, если тип данных, который мы добавляем, bigint, его значение прыжка будет 10 000.


Это действительно БАГ?

Microsoft заявляет, что это функция, а не ошибка, и она полезна во многих случаях. Но в нашем случае такая функция не нужна, потому что эти самоинкрементные данные предназначены для показа клиентам, и клиенты будут чувствовать себя странно, увидев такие прыжкие данные. А значение прыжка определяется количеством перезапуска SQL Server. Если эти данные не будут показаны клиентам, они могут быть приемлемы. Поэтому эта функция обычно подходит только для внутреннего использования.



решение

Если нас не интересует эта «функция», предлагаемая Microsoft, есть два способа её отключить.

1. Использование последовательностей

2. Зарегистрировать параметр запуска -t272 для SQL Server



Использование последовательностей

Во-первых, нужно убрать самоувеличивающиеся столбцы таблицы. Затем создайте последовательность без кэширования, из которой вставляются числовые значения. Вот пример кода:


Зарегистрировать параметр запуска -t272

Открытый менеджер конфигурации SQL Server. Выберите экземпляр SQL Server 2012, кликните правой кнопкой мыши и выберите меню «Свойства». Найдите параметры запуска в всплывающем окне и зарегистрируйте -t272. После завершения перезапустите SQL Server (SQLSERVER2012) на рисунке ниже, а затем выполните операцию воспроизведения ошибок, чтобы убедиться, решена ли проблема.




Дополнительные примечания:

Если в вашей базе данных много самонадувающихся таблиц и у всех есть проблемы с числовыми переходами, лучше использовать второй вариант. Потому что всё очень просто, а область применения сервера. Принятие второго решения затронет все базы данных в этом экземпляре сервиса.





Предыдущий:Веб-сервер возвращает тип и значение статусного кода
Следующий:Обновите метод работы саморастущего столбца ID в базе данных SQL Server
 Хозяин| Опубликовано 08.07.2020 15:15:52 |
SQL Server функционирует в более высоких версиях. Он «кэширует» 1000 идентификационных значений заранее для сопротивления производительности
Отказ:
Всё программное обеспечение, программные материалы или статьи, публикуемые Code Farmer Network, предназначены исключительно для учебных и исследовательских целей; Вышеуказанный контент не должен использоваться в коммерческих или незаконных целях, иначе пользователи несут все последствия. Информация на этом сайте взята из Интернета, и споры по авторским правам не имеют отношения к этому сайту. Вы должны полностью удалить вышеуказанный контент с компьютера в течение 24 часов после загрузки. Если вам нравится программа, пожалуйста, поддержите подлинное программное обеспечение, купите регистрацию и получите лучшие подлинные услуги. Если есть нарушение, пожалуйста, свяжитесь с нами по электронной почте.

Mail To:help@itsvse.com