Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 12359|Απάντηση: 1

[Πηγή] Στήλες αυτόματης ανάπτυξης του SQL Server 2012 με ζητήματα μεταπήδησης τιμών

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 23/8/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 και εδώ χρησιμοποιούμε το SQL Server Manager για να το επανεκκινήσουμε:



Μετά την επανεκκίνηση, εισάγουμε 2 ακόμη κομμάτια δεδομένων στον πίνακα μόλις τώρα:



Ελέγξτε τα αποτελέσματα:




Τώρα βλέπετε τα αποτελέσματα μετά την επανεκκίνηση του SQL Server 2012 και οι τιμές της στήλης αυτόματης αύξησης ξεκινούν από 1002. Δηλαδή πήδηξε 1000. Όπως αναφέρθηκε προηγουμένως, εάν ο τύπος δεδομένων που προσθέτουμε είναι bigint, η τιμή άλματος θα είναι 10,000.


Είναι πραγματικά BUG;

Η Microsoft δηλώνει ότι αυτό είναι ένα χαρακτηριστικό, όχι ένα σφάλμα, και είναι χρήσιμο σε πολλά σενάρια. Αλλά στην περίπτωσή μας, δεν χρειαζόμαστε μια τέτοια λειτουργία, επειδή αυτά τα αυτοαυξητικά δεδομένα προορίζονται να εμφανίζονται στους πελάτες και οι πελάτες θα αισθάνονται περίεργα αν δουν τέτοια δεδομένα άλματος. Και η τιμή μετάβασης καθορίζεται από τον αριθμό των επανεκκίνησης του SQL Server. Εάν αυτά τα δεδομένα δεν εμφανίζονται στους πελάτες, μπορεί να είναι αποδεκτά. Επομένως, αυτή η δυνατότητα είναι συνήθως κατάλληλη μόνο για εσωτερική χρήση.



λύση

Εάν δεν μας ενδιαφέρει αυτή η «δυνατότητα» που προσφέρει η Microsoft, υπάρχουν δύο τρόποι με τους οποίους μπορούμε να την απενεργοποιήσουμε.

1. Χρήση ακολουθιών

2. Καταχωρήστε την παράμετρο εκκίνησης -t272 για τον SQL Server



Χρήση ακολουθιών

Αρχικά, πρέπει να αφαιρέσουμε τις στήλες του πίνακα που αυξάνονται αυτόματα. Στη συνέχεια, δημιουργήστε μια ακολουθία χωρίς προσωρινή αποθήκευση, από την οποία εισάγονται οι αριθμητικές τιμές. Εδώ είναι το δείγμα κώδικα:


Καταχωρίστε την παράμετρο εκκίνησης -t272

Ανοίξτε το SQL Server Configuration Manager. Επιλέξτε την παρουσία του SQL Server 2012, κάντε δεξί κλικ και επιλέξτε το μενού Ιδιότητες. Βρείτε τις παραμέτρους εκκίνησης στο αναδυόμενο παράθυρο και εγγραφείτε -t272. Μετά την ολοκλήρωση, κάντε επανεκκίνηση του SQL Server (SQLSERVER2012) στην παρακάτω εικόνα και, στη συνέχεια, εκτελέστε τη λειτουργία αναπαραγωγής σφαλμάτων για να επαληθεύσετε εάν το πρόβλημα έχει επιλυθεί.




Επιπλέον σημειώσεις:

Εάν έχετε πολλούς πίνακες που φουσκώνουν μόνοι τους στη βάση δεδομένων σας και όλοι έχουν προβλήματα αριθμητικού άλματος, τότε είναι καλύτερο να χρησιμοποιήσετε τη δεύτερη επιλογή. Επειδή είναι πολύ απλό και το πεδίο εφαρμογής είναι σε επίπεδο διακομιστή. Η υιοθέτηση της δεύτερης λύσης θα επηρεάσει όλες τις βάσεις δεδομένων σε αυτήν την παρουσία υπηρεσίας.





Προηγούμενος:Ο διακομιστής web επιστρέφει τον τύπο και τη σημασία του κωδικού κατάστασης
Επόμενος:Ενημέρωση της μεθόδου λειτουργίας της στήλης αναγνωριστικού που αναπτύσσεται αυτόματα στη βάση δεδομένων του SQL Server
 Σπιτονοικοκύρης| Δημοσιεύτηκε στις 8/7/2020 3:15:52 μ.μ. |
Χαρακτηριστικά του SQL Server σε υψηλότερες εκδόσεις. «Αποθηκεύει» 1000 τιμές αναγνώρισης εκ των προτέρων για λόγους απόδοσης
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com