2012-04-16 5 views
5

काम हम सेटिंग्स जो अनिवार्य रूप से निम्नलिखित कॉलम शामिल धारण करने के लिए एक मेज के लिए अद्यतन जोड़ा लेकिन दुर्लभ अवसरों पर, सेटिंग्स हटा दी जाती हैं। दुर्भाग्यवश इसका अर्थ यह है कि किसी भी स्क्रिप्ट जो पहले इस मान को अपडेट कर सकती है, इस तथ्य के बावजूद ऐसा करेगी कि अद्यतन परिणाम "0 rows updated" में हैं और अप्रत्याशित व्यवहार की ओर जाता है।रोकें न के बराबर पंक्तियों

इस स्थिति को हाल ही में एक रिग्रेशन टेस्ट विफलता द्वारा उठाया गया था, लेकिन केवल जांच के बाद कि सिस्टम में डेटा अलग क्यों था।

तो मेरा प्रश्न है: क्या शून्य पंक्तियों में अद्यतन परिणाम अपडेट होने पर त्रुटि स्थिति उत्पन्न करने का कोई तरीका है?

यहां कुछ विकल्प मैं के बारे में सोचा है, लेकिन उनमें से कोई वास्तव में वह सब वांछित हैं:

  • PL/SQL आवरण जो विफल रहा है अद्यतन देखती है और एक अपवाद फेंकता है।
    • आदर्श नहीं है क्योंकि यह किसी भी/स्क्रिप्ट को मैन्युअल रूप से अद्यतन करने से रोकता नहीं है।
  • तालिका पर एक ट्रिगर जो अपवाद फेंकता है।
    • ट्रिगर्स को चरणबद्ध करने की हमारी वर्तमान नीति के खिलाफ जाता है।
    • हर बार एक सेटिंग को हटाया जाता है और अप्रचलित सेटिंग्स की सूची बनाए रखने (यदि बहिष्करण कर रहा है) ट्रिगर को अद्यतन करने की आवश्यकता होती है।
    • में उत्परिवर्तनीय तालिका के साथ समस्या हो सकती है (यदि वर्तमान में कौन सी सेटिंग मौजूद हैं, तो पूछताछ करके शामिल करना)।
+0

कैसे 0 पंक्तियों की एक अद्यतन si को जन्म दे सकता अद्यतन कर सकते हैं ट्यूशन कि डेटा अलग हैं? –

+0

@TheNail प्रश्न में सेटिंग एक समय देरी थी। पुराने कोड में मान अपडेट किया गया था और डेटा में दी गई देरी शामिल थी। नए कोड में यह नहीं था। Ergo रिग्रेशन। यह सेटिंग तब भी होती जब सेटिंग नियंत्रित हो रही थी कि कुछ फीचर चालू है या नहीं। –

उत्तर

1

नहीं वास्तव में एक समाधान लेकिन चीज़ें थोड़ी व्यवस्थित करने के लिए एक विधि:

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

परिभाषा तालिका PARAMS (ID, NAME)

वास्तविक सेटिंग्स तालिका PARAM_VALUES (PARAM_ID, VALUE)

(बदलते अपनी मेज संरचना भी स्क्रिप्ट को अपडेट नहीं किया गया में त्रुटियों आह्वान एक बहुत प्रभावी तरीका है ...)

3

एक पी एल/एसक्यूएल रैपर मेरे लिए सबसे अच्छा विकल्प लगता है। अनुक्रम उत्पन्न करने और इतिहास रिकॉर्ड डालने के अपवाद के साथ, ट्रिगर्स चरणबद्ध करने के लिए एक बड़ी बात है।

यदि आप पीएल/एसक्यूएल रैपर का उपयोग करने के बजाय मैन्युअल रूप से अपडेट करने वाले किसी व्यक्ति के बारे में चिंतित हैं, तो बस उपयोगकर्ता की भूमिका को प्रतिबंधित करें ताकि उसके पास तालिका पर अपडेट विशेषाधिकार न हों लेकिन प्रक्रिया पर विशेषाधिकार प्राप्त हो।

1

हो सकता है आप मर्ज बयान यहाँ उपयोग कर सकते हैं, के लिए यह

http://www.oracle-developer.net/display.php?id=203

मर्ज बयान आप एक ही क्वेरी में डालने और अद्यतन गठबंधन करने के लिए अनुमति देता है एक लिंक है, इसलिए मामले में वांछित पंक्ति नहीं है आप इंगित करने के लिए पंक्ति मौजूद नहीं है एक बफर तालिका में एक रिकॉर्ड सम्मिलित कर सकते हैं मौजूद हैं या फिर आप आवश्यक रिकॉर्ड

आशा है कि यह मदद करता है

+0

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