Access
 sql >> डेटाबेस >  >> RDS >> Access

Microsoft SQL अनुक्रमों के साथ संख्या विरोध से बचें

Microsoft SQL अनुक्रमों के साथ संख्या विरोध से बचें

नोट:मैं इस विषय पर SQL सर्वर समूह के साथ ऑनलाइन एक्सेस पर प्रस्तुत करूंगा। कृपया मेरे साथ 13 सितंबर को शाम 6:30 बजे सीएसटी में शामिल हों, बैठक के सभी विवरणों के साथ एक ईमेल प्राप्त करने के लिए समूह में शामिल हों, यह मुफ़्त है!

  • क्या आपको इस बात की गारंटी देने की आवश्यकता है कि किसी फ़ील्ड में एक नंबर का उपयोग केवल एक बार किया जाएगा और किसी अन्य उपयोगकर्ता द्वारा कभी दोहराया नहीं जाएगा?
  • क्या आपको ऐसी स्थिति का सामना करना पड़ा है जहां आपको एक टेबल में एक से अधिक ऑटोनंबर की आवश्यकता है?
  • क्या आपको कभी अनुक्रमिक संख्याओं की निचली और ऊपरी सीमा की आवश्यकता है, और आप इससे आगे नहीं जा सके?
  • क्या आपके पास कभी-कभी उन नंबरों की सूची होती है जिन्हें आप पिछले नंबर से आगे निकल जाने के बाद रीसायकल करना चाहते हैं?

SQL सर्वर में एक फीचर होता है जो इसे काफी आसानी से हैंडल कर सकता है और इसे सीक्वेंस कहा जाता है। यह SQL सर्वर 2012 में उपलब्ध है।

एक ऑटोनंबर की तरह, यह आश्वस्त कर सकता है कि हर बार एक अद्वितीय नंबर दिया जाएगा, जब तक कि यह रीसायकल न हो जाए।

हाल ही में मुझे एक क्लाइंट के लिए एक अनुक्रम लागू करने के लिए कहा गया था, जहां कई उपयोगकर्ता नए रिकॉर्ड बनाएंगे और एक विशिष्ट क्रम में अगले नंबर को "लाने" के लिए होगा। हम एक ऑटोनंबर का उपयोग नहीं कर सके क्योंकि ग्राहक एक निश्चित सीमा तक सीमित था, ऊपरी सीमा से अधिक नहीं। जब संख्या समाप्त हो जाती है, तो प्रबंधन अनुक्रम को नए सिरे से भर देगा।

पहुंच तालिका का उपयोग क्यों काम नहीं करता

SQL सर्वर में अपग्रेड करने से पहले, उपयोगकर्ता एक तालिका साझा करेंगे जो इस बात पर नज़र रखेगी कि उपयोग करने के लिए अगला नंबर क्या है, इस दृष्टिकोण के साथ समस्या यह है कि यह मूर्खतापूर्ण नहीं है, दो उपयोगकर्ता एक ही समय में एक ही नंबर का अनुरोध कर सकते हैं, व्यापार नियम का उल्लंघन।

SQL सर्वर अनुक्रम बनाना और उपयोग करना

अनुक्रम का उपयोग करने से पहले, इसे SQL सर्वर में निम्नलिखित सिंटैक्स के साथ बनाया जाना चाहिए, आपको इसे केवल एक बार करने की आवश्यकता है:

अगली अनुक्रम संख्या प्राप्त करने के लिए निम्नलिखित कथन का उपयोग करें:
dbo.seqPolicyNumber को NextValue के रूप में अगला मान चुनें
आपके उपयोगकर्ताओं को अनुक्रम का उपयोग करने के लिए अद्यतन अनुमतियों की आवश्यकता होगी, लेकिन वे अनुक्रम की सीमा को बदलने में सक्षम नहीं होना चाहिए। इस सिंटैक्स का उपयोग करके अपडेट अनुमतियां दी जा सकती हैं:
dbo.seqPolicyNumber को [MyDatabaseUserOrRole]; पर अपडेट दें
Microsoft Access VBA प्रोग्राम से अनुक्रम का अगला मान प्राप्त करने के लिए, आप ADODB रिकॉर्डसेट में अगला मान पढ़ने के लिए निम्न कथन का उपयोग कर सकते हैं।
strSQL ="dbo के लिए अगला मान चुनें .seqPolicyNumber as NextValue"
OpenMyRecordset rs, strSQL
NextValue =rs("NextValue")

इस प्रकार हम आम तौर पर अपनी फर्म में ADODB रिकॉर्डसेट खोलते हैं। आप OpenMyRecordset का उपयोग कैसे कर सकते हैं, इस बारे में अधिक जानकारी के लिए, आप हमारे ब्लॉग में किसी अन्य लेख पर क्लिक कर सकते हैं:

आसान ADODB रिकॉर्डसेट और एक्सेस में कमांड

अगली अनुक्रम संख्या प्राप्त करने के लिए वाक्यविन्यास के बारे में अच्छी बात यह है कि टी-एसक्यूएल में इसका उपयोग करना बहुत आसान है। आप बस <अनुक्रम नाम> के लिए अगला मान स्थानापन्न करें, जहां आपको सामान्य रूप से फ़ील्ड नाम, पैरामीटर या स्थिरांक से एक मान प्राप्त होगा। निम्नलिखित दिखाता है कि इसे सम्मिलित विवरण में कैसे उपयोग किया जा सकता है।
INSERT dbo.Orders (OrderID, Name, Qty)
VALUES (dbo के लिए अगला मान।OrderNumberSequence, 'टायर', 2);

ऑटोनंबर की तुलना में अधिक लचीलापन

एक अनुक्रम एक्सेस में एक ऑटोनंबर या SQL सर्वर में एक पहचान फ़ील्ड की तुलना में अधिक लचीलापन प्रदान कर सकता है। सबसे पहले, आपके पास तालिका में केवल एक ऑटोनंबर या पहचान फ़ील्ड हो सकता है। यद्यपि आप एक पहचान फ़ील्ड का शोध कर सकते हैं, आप मूल्यों को पुन:चक्रित नहीं कर सकते। प्राथमिक कुंजी के लिए पहचान फ़ील्ड अभी भी उपयोगी हैं, जब हम रिकॉर्ड की पहचान करने के लिए कुछ मनमानी संख्या चाहते हैं, और इसका कोई अर्थ नहीं है। हालांकि अनुक्रम श्रेणियों का अर्थ अंतर्निहित हो सकता है।

आप पहचान जैसे पूर्णांकों का उपयोग करने के लिए भी प्रतिबंधित नहीं हैं, लेकिन अनुक्रम संख्या दशमलव या संख्यात्मक भी हो सकती है। इसके अलावा, आप अपने क्रम में ऊपर की बजाय नीचे की ओर वृद्धि कर सकते हैं।

साथ ही एक अनुक्रम किसी विशिष्ट तालिका से बंधा नहीं है और सभी तालिकाओं में उपयोग किया जा सकता है क्योंकि किसी विशेष तालिका के लिए नए अनुक्रम संख्याओं की आवश्यकता होती है।

अनुक्रम को फिर से भरें

जब आप किसी अनुक्रम के लिए सीमा बदलना चाहते हैं, जैसे कि जब आपको नीति संख्याओं की एक नई श्रेणी की आवश्यकता होती है, तो इसे एक संग्रहीत कार्यविधि के साथ किया जाना चाहिए। निम्नलिखित एक संग्रहित प्रक्रिया है जो ऐसा कर सकती है।
ANSI_NULLS चालू करें
GO
SET QUOTED_IDENTIFIER ON
GO

प्रक्रिया बनाएं [डीबीओ]। BEGIN
NOCOUNT ON करें;

DECLARE @sql nvarchar(MAX),
@err nvarchar(MAX);

यदि मौजूद नहीं है (
sys.sequences AS से
से NULL चुनें
जहां s.name =@SeqName
और s.schema_id =SCHEMA_ID('dbo')
)
50000 फेंको, 'अनुक्रम नाम मान्य नहीं है।', 1;

IF @InpMin NULL है या @InpMax IS NULL है
50000 फेंक दें, 'मान शून्य नहीं हो सकते।', 1;

SET @sql =CONCAT(N'ALTER SEQUENCE [dbo]।', QUOTENAME(@SeqName), N' RESTART with', @InpMin, N' INCREMENT by 1′, N' MINVALUE ', @InpMin, N' MAXVALUE ' , @InpMax, N' NO CYCLE NO CACHE;');
EXEC sys.sp_executesql @sql;

;

END

इस संग्रहित प्रक्रिया में कुछ बातें ध्यान देने योग्य हैं। पहले हम इसे
स्वामी के रूप में निष्पादित करने के साथ चला रहे हैं।

हम नहीं चाहते कि दैनिक उपयोगकर्ता किसी क्रम को बदलने में सक्षम हो। लेकिन हम उन्हें केवल एक संग्रहीत प्रक्रिया के माध्यम से इसे बदलने की सीमित क्षमता देना चाहते हैं। (उपयोगकर्ताओं को केवल संग्रहीत कार्यविधि के अधिकारों की आवश्यकता होती है।)
dbo.usp_AlterPolicySequence पर [MyDatabaseUserOrRole]; पर निष्पादन प्रदान करें;
इस संग्रहीत कार्यविधि को एक्सेस फ्रंट एंड से चलाया जा सकता है, जब भी अनुक्रम में एक नई श्रेणी को स्थापित करने की आवश्यकता होती है, और यह सामान्य रूप से एक व्यवस्थापक उपयोगकर्ता द्वारा होगा, जिसके पास सामान्य उपयोगकर्ता की तुलना में अधिक SQL सर्वर विशेषाधिकार हो सकते हैं।

हालाँकि यह संग्रहीत कार्यविधि तब भी चलाई जा सकती है जब संख्याओं की एक नई श्रेणी अनुक्रम में लोड होने की प्रतीक्षा कर रही हो, ठीक वर्तमान अनुक्रम के उपयोग के बाद। इस मामले में संग्रहीत प्रक्रिया को किसी भी उपयोगकर्ता द्वारा कॉल किया जा सकता है जिसे नई श्रेणी के लिए पहली पॉलिसी नंबर की आवश्यकता होती है। इसलिए हम केवल इस सीमित उपयोग के लिए उन्हें अधिक अधिकार देने के लिए EXECUTE AS OWNER AS का उपयोग करते हैं।

ध्यान देने वाली एक और बात यह है कि SQL स्ट्रिंग का निर्माण करना आवश्यक है, और फिर उपयोग करें
EXEC sys.sp_executesql

उस स्ट्रिंग पर, यदि हम पैरामीटर का उपयोग कर रहे हैं।

यदि SSMS क्वेरी विंडो में टाइप किया गया है, या संग्रहीत कार्यविधि में उपयोग किया गया है, तो निम्न कथन कार्य करेगा।

ALTER SEQUENCE dbo.seqPolicyNumber
50005000 के साथ पुनरारंभ करें
1 तक वृद्धि
MINVALUE 50005000
MAXVALUE 50005999
कोई साइकिल नहीं
कोई कैश नहीं

हालांकि निम्नलिखित संग्रहीत कार्यविधि में पैरामीटर का उपयोग करके काम नहीं करेंगे।
ALTER SEQUENCE dbo.seqPolicyNumber
@InpMin के साथ पुनरारंभ करें
1 से वृद्धि
MINVALUE @ InpMin
MAXVALUE @InpMax
कोई साइकिल नहीं
कोई कैश नहीं

तो आपको चिपकाए गए पैरामीटर मानों के साथ स्ट्रिंग स्टेटमेंट बनाने की आवश्यकता है।
SET @sql =CONCAT(N'ALTER SEQUENCE [dbo]।', QUOTENAME(@SeqName), N' ', @InpMin, N' इंक्रीमेंट बाय 1', N' MINVALUE', @InpMin, N' MAXVALUE ', @InpMax, N' NO CYCLE NO CACHE;'); के साथ पुनरारंभ करें

EXEC sys.sp_executesql @sql;
यह स्ट्रिंग @sql CONCAT और QUOTENAME फ़ंक्शन का उपयोग करके बनाई गई है। यदि आप अपनी अंतिम स्ट्रिंग बनाने के लिए प्लस चिह्नों का उपयोग करते हैं तो यह भी काम करेगा, लेकिन इसे उस उदाहरण की तरह करना बेहतर है जो नल सुरक्षित है।

यदि आप अनुपलब्ध या खराब मान प्रदान करते हैं, तो यह संग्रहीत कार्यविधि एक त्रुटि उत्पन्न करेगी (फेंक देगी), और आपको जारी रखने की अनुमति नहीं दी जाएगी। यदि सभी अनुक्रम संख्याओं का उपयोग किया जाता है तो यह स्वचालित रूप से एक त्रुटि उत्पन्न करेगा।

आपकी फ्रंट एंड एक्सेस प्रक्रिया को यह देखने के लिए जांचना चाहिए कि कोई त्रुटि नहीं हुई है, जो केवल तभी होनी चाहिए जब अनुक्रम संख्या से बाहर हो जाए, यदि आप उचित पैरामीटर इनपुट प्रदान कर रहे हैं। यदि कोई त्रुटि दिखाई देती है, तो फ्रंट एंड को किसी तरह अपना संचालन रद्द करना होगा।

कुछ अन्य क्षमताएं हैं जिन्हें आप तर्कों के साथ सेट कर सकते हैं। CYCLE अनुक्रम के अंत तक पहुंचने के बाद फिर से चक्र की अनुमति देगा, और फिर MINVALUE पर जाएगा। आप अनुक्रम के बीच में इसे एक RESTART मान देकर स्पष्ट रूप से पुनः आरंभ भी कर सकते हैं।

आप इसे एक CACHE भी दे सकते हैं, उदाहरण के लिए आप एक बार में 50 अनुक्रम संख्या के लिए पूछ सकते हैं, और यह हर 50 नंबरों में एक बार सिस्टम अनुक्रम तालिकाओं को अद्यतन करता है, जो तेज़ हो सकता है, लेकिन बिजली की विफलता होने पर यह एक जोखिम भी जोड़ता है , चूंकि इन नंबरों का पुन:उपयोग नहीं किया जा सकता है

इस संग्रहीत कार्यविधि में ध्यान देने योग्य अंतिम बात यह है कि आप sys.sequences नामक सिस्टम दृश्य से अपने अनुक्रमों के बारे में जानकारी (मेटा-डेटा) खींच सकते हैं। इसमें निम्नलिखित जानकारी है।


कुछ उपयोगी कॉलम जिन्हें आप किसी उपयोगकर्ता को पढ़ना और बताना चाहेंगे, वे हैं न्यूनतम_मान, अधिकतम_मान, और current_value.


यदि आप रुचि रखते हैं, तो MSDN पर निम्नलिखित पृष्ठों में अनुक्रमों पर बहुत उपयोगी जानकारी है।

अनुक्रम संख्याएँ
अनुक्रमों का वर्णन करती हैं और सामान्य उपयोग के लिए बहुत अच्छे उदाहरण हैं

क्रिएट सीक्वेंस (ट्रांजैक्ट-एसक्यूएल)

वैकल्पिक अनुक्रम (लेनदेन-एसक्यूएल)

(ट्रांजैक्ट-एसक्यूएल) के लिए अगला मूल्य

sys.sequences (Transact-SQL)
उस मेटा-डेटा का वर्णन करता है जिस पर आप अपने अनुक्रमों के लिए क्वेरी कर सकते हैं


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सीआरएम के रूप में एक्सेस का उपयोग कैसे करें

  2. माइक्रोसॉफ्ट एक्सेस पॉडकास्ट एपिसोड 1 सुनें

  3. एक्सेस पर इन्वेंटरी डेटाबेस कैसे बनाएं

  4. VBA कीमिया:तरीकों को गुणों में बदलना

  5. हेल्थकेयर उद्योग डेटाबेस का उपयोग कैसे करता है