Тази статия е огледална статия за машинен превод, моля, кликнете тук, за да преминете към оригиналната статия.

Изглед: 12359|Отговор: 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.


фон

Преди няколко дни колега от нашия QA екип предложи: Стойността на колоната за самоувеличаване на нашата таблица се увеличи с 10 000 необяснимо ниво. С други думи, последната стойност на колоната за самоувеличаване в нашата таблица беше 2200, но сега, когато добавихме нов запис, стойността на самоувеличаващата се колона стана 12200. В нашата бизнес логика такива ситуации не са позволени на клиента, затова трябва да решим този проблем.


Използване на кода

В началото всички бяхме много странни, как се случи това? Обикновено не вмъкваме ръчно никакви стойности в самонадуващи се колони (ръчното вмъкване на стойности в самонадуващи се колони е приемливо), а стойностите на самонадуващите се колони се поддържат от самата база данни. Член на основния ни екип започна да изследва този въпрос и намери отговора. Сега бих искал да обясня този проблем подробно и решението, което колегата ми намери.


Как да възпроизведем този бъг


Ще трябва да инсталираш SQL Server 2012 и след това да създадеш тестова база данни. След това създайте таблица със саморастящи се колони:
Сега вмъкнете две данни:

Прегледайте резултатите:






В този момент резултатът беше същият, както очаквахме. Сега рестартирай услугата на SQL Server. Има няколко начина да рестартирате SQL Service, а тук използваме SQL Server Manager, за да го рестартираме:



След рестарт току-що вмъкваме още 2 парчета данни в таблицата:



Прегледайте резултатите:




Сега виждате резултатите след рестартиране на SQL Server 2012, а самоувеличаващите се стойности на колоните започват от 1002. Тоест, прескочи 1000. Както беше споменато по-рано, ако типът данни, който добавяме, е bigint, неговата скокова стойност ще бъде 10 000.


Наистина ли е БЪГ?

Microsoft заявява, че това е функция, а не бъг, и е полезно в много ситуации. Но в нашия случай не ни е нужна такава функция, защото тези самоинкрементални данни са предназначени да се показват на клиентите и клиентите ще се почувстват странно, ако видят такива скачащи данни. А стойността на скока се определя от броя пъти, в които рестартирате SQL Server. Ако тези данни не бъдат показани на клиентите, може да са приемливи. Затова тази функция обикновено е подходяща само за вътрешна употреба.



решение

Ако не се интересуваме от тази "функция", предлагана от Microsoft, има два начина да я изключим.

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

2. Регистрирайте стартовия параметър -t272 за SQL Server



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

Първо, трябва да премахнем самоувеличаващите се колони на таблицата. След това създайте последователност без кеширане, от която се вмъкват числовите стойности. Ето примерния код:


Регистрирайте стартовия параметър -t272

Open SQL Server Configuration Manager. Изберете вашия SQL Server 2012 инстанс, кликнете с десен бутон и изберете менюто Properties. Намерете параметрите за стартиране в изскачащия прозорец и регистрирайте -t272. След завършване рестартирайте SQL Server (SQLSERVER2012) на фигурата по-долу и след това изпълнете операцията за възпроизвеждане на бъгове, за да проверите дали проблемът е решен.




Допълнителни бележки:

Ако имаш много самонадуващи се таблици в базата данни и всички имат проблеми с числовите скокове, по-добре е да използваш втория вариант. Защото е много проста и обхватът е на ниво сървър. Приемането на второто решение ще засегне всички бази данни в тази инстанция на услуга.





Предишен:Уеб сървърът връща типа и значението на кода на статуса
Следващ:Актуализирайте метода на работа на самонарастващата колона ID в базата данни на SQL Server
 Хазяин| Публикувано в 8.07.2020 г. 15:15:52 ч. |
SQL Server има функции в по-високи версии. Той "кешира" 1000 идентификационни стойности предварително поради причини за производителност
Отричане:
Целият софтуер, програмни материали или статии, публикувани от Code Farmer Network, са само за учебни и изследователски цели; Горното съдържание не трябва да се използва за търговски или незаконни цели, в противен случай потребителите ще понесат всички последствия. Информацията на този сайт идва от интернет, а споровете за авторски права нямат нищо общо с този сайт. Трябва напълно да изтриете горното съдържание от компютъра си в рамките на 24 часа след изтеглянето. Ако ви харесва програмата, моля, подкрепете оригинален софтуер, купете регистрация и получете по-добри услуги. Ако има нарушение, моля, свържете се с нас по имейл.

Mail To:help@itsvse.com