अनुक्रम वास्तव में रीसेट करने के लिए डिज़ाइन नहीं किए गए हैं। लेकिन ऐसे कुछ मामले हैं जहां अनुक्रम को रीसेट करना वांछनीय है, उदाहरण के लिए, परीक्षण डेटा सेट करते समय, या उत्पादन डेटा को परीक्षण वातावरण में वापस विलय करते समय। इस प्रकार की गतिविधि नहीं है सामान्य रूप से उत्पादन में किया जाता है।
यदि इस प्रकार के ऑपरेशन को उत्पादन में लगाया जा रहा है, तो इसे पूरी तरह से परीक्षण करने की आवश्यकता है। (सबसे अधिक चिंता का कारण यह है कि रीसेट प्रक्रिया को गलती से गलत समय पर, जैसे, वर्ष के मध्य में निष्पादित किया जा सकता है।
अनुक्रम को गिराना और फिर से बनाना एक दृष्टिकोण है। जहाँ तक SEQUENCE की बात है, एक ऑपरेशन के रूप में, यह काफी सीधा है:
ड्रॉप अनुक्रम MY_SEQ; अनुक्रम बनाएं MY_SEQ 1 MINVALUE 0 से 1 वृद्धि के साथ प्रारंभ करें;
[संपादित करें] जैसा कि मैथ्यू वाटसन सही ढंग से बताते हैं, प्रत्येक डीडीएल कथन (जैसे ड्रॉप, क्रिएट, ऑल्टर) एक अंतर्निहित प्रतिबद्धता का कारण बनता है। [/संपादित करें]
लेकिन, SEQUENCE पर दिए गए किसी भी विशेषाधिकार को छोड़ दिया जाएगा, इसलिए उन्हें फिर से देने की आवश्यकता होगी। अनुक्रम का संदर्भ देने वाली कोई भी वस्तु अमान्य हो जाएगी। इसे और अधिक सामान्यीकृत करने के लिए, आपको विशेषाधिकारों को सहेजना होगा (अनुक्रम छोड़ने से पहले) और फिर उन्हें फिर से देना होगा।
दूसरा तरीका मौजूदा अनुक्रम को बिना गिराए और फिर से बनाए बिना बदलना है। अनुक्रम को रीसेट करना INCREMENT मान को ऋणात्मक मान (वर्तमान मान और 0 के बीच का अंतर) में बदलकर पूरा किया जा सकता है, और फिर वर्तमान मान को 0 पर सेट करने के लिए ठीक एक .NEXTVAL करें, और फिर वृद्धि को वापस 1 में बदलें। मैंने पहले भी इसी दृष्टिकोण का उपयोग किया है (मैन्युअल रूप से, एक परीक्षण वातावरण में), एक अनुक्रम को एक बड़े मूल्य पर भी सेट करने के लिए।
बेशक, इसके सही ढंग से काम करने के लिए, आपको बीमा . की आवश्यकता है कोई अन्य सत्र अनुक्रम का संदर्भ नहीं देता है, जबकि यह ऑपरेशन किया जा रहा है। गलत समय पर एक अतिरिक्त .NEXTVAL रीसेट को खराब कर देगा। (नोट:डेटाबेस पक्ष पर इसे प्राप्त करना मुश्किल होगा, यदि एप्लिकेशन एक अलग उपयोगकर्ता के बजाय अनुक्रम के स्वामी के रूप में कनेक्ट हो रहा है।)
इसे हर साल होने के लिए, आपको नौकरी निर्धारित करने की आवश्यकता होगी। अनुक्रम रीसेट को आपके पहचानकर्ता के YYYY भाग के रीसेट के साथ समन्वयित करना होगा।
यहां एक उदाहरण दिया गया है:
http://www.jaredstill.com/content/reset-sequence.html ए>
[संपादित करें]
अपरीक्षणित अनुक्रम को रीसेट करने के लिए PL/SQL ब्लॉक के एक संभावित डिज़ाइन के लिए प्लेसहोल्डर
pragma स्वायत्त_लेनदेन घोषित करें; ln_increment संख्या; ln_curr_val संख्या; ln_reset_increment संख्या; ln_reset_val संख्या; start -- अनुक्रम के लिए वर्तमान वृद्धि मान सहेजें user_sequences से ln_increment में वृद्धि_बाई का चयन करें जहां अनुक्रम_नाम ='MY_SEQ'; - अनुक्रम को रीसेट करने के लिए आवश्यक वृद्धि मूल्य निर्धारित करें - अगले प्राप्त मूल्य से 0 चयन -1 - MY_SEQ.nextval में ln_reset_increment दोहरे से; - अगला मान प्राप्त करें (इसे वर्तमान मान बनाने के लिए) MY_SEQ.nextval को दोहरे से ln_curr में चुनें; -- अनुक्रम के वृद्धि मूल्य को तत्काल निष्पादित करने के लिए बदलें 'अनुक्रम MY_SEQ वृद्धि को बदलें' || ln_reset_increment ||' न्यूनतम मान 0'; -- अनुक्रम को 0 पर सेट करने के लिए आगे बढ़ाएं MY_SEQ.nextval को दोहरे से ln_reset_val में चुनें; -- वृद्धि को पिछले (लाइ सेव किए गए) मान पर वापस सेट करें तत्काल तत्काल 'अनुक्रम बदलें MY_SEQ वेतन वृद्धि' || ln_increment; समाप्त; // पूर्व>नोट:
- रीसेट होने के दौरान अनुक्रम को एक्सेस से सर्वोत्तम तरीके से कैसे सुरक्षित रखें, इसका नाम बदलें?
- कई परीक्षण मामले यहां काम करने के लिए।
- पहले पास, सकारात्मक, आरोही, वृद्धि 1 अनुक्रम के मानक मामलों की जांच करें।
- नया SEQUENCE बनाने, अनुमतियाँ जोड़ने, मौजूदा और नए अनुक्रमों का नाम बदलने और फिर निर्भरता को फिर से संकलित करने के लिए एक बेहतर तरीका होगा?