2008-09-05 10 views
56

यदि आपने ओरेकल का उपयोग किया है, तो संभवतः आपको उपयोगी संदेश मिल गया है "ORA-00942: तालिका या दृश्य मौजूद नहीं है"। क्या कोई वैध तकनीकी कारण है जिसमें संदेश में गुम वस्तु का नाम शामिल नहीं है?ओरेकल आपको क्यों नहीं बताता कि तालिका या दृश्य मौजूद नहीं है?

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

मेरा अनुमान है कि जब यह त्रुटि मूल रूप से लागू की गई थी, तो किसी ने ऑब्जेक्ट नाम जोड़ने की उपेक्षा की, और अब, लोग डरते हैं कि इसे ठीक करने के लिए संगतता तोड़ जाएगी। (अगर त्रुटि बदलती है तो त्रुटि संदेश को पार्स करने जैसी मूर्खतापूर्ण चीजें उलझन में होंगी।)

क्या गायब तालिका का नाम निर्धारित करने के लिए कोई डेवलपर-अनुकूल (आपके डीबीए भर्ती के विपरीत) है?


हालांकि मैं एक जवाब जो विषय से संबंधित है स्वीकार कर लिया है, यह वास्तव में मेरे सवाल का जवाब नहीं है: क्यों त्रुटि संदेश के नाम हिस्सा नहीं है? यदि कोई असली जवाब के साथ आ सकता है, तो मुझे अपना वोट बदलने में खुशी होगी।

+1

मुझे लगता है कि आपको असली जवाब प्राप्त करने के लिए एक वास्तविक ओरेकल इंजीनियर से पूछना होगा। संयोग से, मैं साइबेस के लिए काम करता हूं, और हमारा सर्वर (एसक्यूएल कहीं भी) आपको "टेबल 'ब्लाह नहीं मिला"। –

+3

यह एक गैर-प्रकटीकरण प्रतिबिंब के कारण हो सकता है;): [लिंक] (http://www.cloudave.com/13729/amazon-google-facebook- माइक्रोसॉफ्ट-apple-and-oracle-org-chart/) –

+7

खैर मैं पोस्टर से पूरी तरह से सहमत हूं। मुझे विकास के मुद्दों को खोजने की कोशिश करने में मुझे कई घंटे लग गए हैं क्योंकि ऑरैकल यह कहने की उपेक्षा करता है कि कौन सी टेबल मौजूद नहीं थी! और सुरक्षा? आप अभी भी उस क्लाइंट को विस्तृत त्रुटि संदेश नित करने का विकल्प चुन सकते हैं जिसे आप सामान्य रूप से कभी नहीं करते! जब मैं स्पष्ट रूप से थोड़ा आगे सोचने की बात आती हूं तो मुझे आमतौर पर ओरेकल सॉफ़्टवेयर बहुत बुरा लगता है ... – Lawrence

उत्तर

13

उपयोगकर्ता_dump_dest में एक विस्तृत ट्रेस फ़ाइल डंप करने के लिए ओरेकल को मजबूर करने के लिए आप अपनी पैरामीटर फ़ाइल (सादा पाठ या स्पफाइल) में एक ईवेंट सेट कर सकते हैं, यदि ऑब्जेक्ट का नाम एसक्यूएल होना चाहिए, तो ऑब्जेक्ट का नाम वहां हो सकता है।

घटना = "942 ट्रेस नाम errorstack स्तर 12"

आप एक सादा पाठ फ़ाइल आप लगातार तर्ज पर अपने सभी घटना सेटिंग्स रखने की जरूरत है प्रयोग कर रहे हैं। यह सुनिश्चित नहीं है कि यह spfile पर कैसे लागू होता है।

+0

मैंने इस लाइन को "init.ora" फ़ाइल में जोड़ने की कोशिश की, फिर मेरे डीबीएमएस को पुनरारंभ किया, लेकिन user_dump_dest फ़ोल्डर में कुछ भी उपलब्ध नहीं था। कोई सुझाव, कृपया? –

5

यदि आप TOAD या TORA जैसे SQL ब्राउज़िंग टूल का उपयोग कर रहे हैं तो यह कर्सर को हाइलाइट करने या इंगित करने के लिए ओआरए त्रुटियों के साथ आपकी मदद करेगा जहां आपने अपनी त्रुटि बनाई थी।

सहायता के लिए इन उपकरणों में से किसी एक को अपने एसक्यूएल में कॉपी और पेस्ट करें। आप विश्लेषण जानकारी भी उपयोगी पा सकते हैं।

+0

मेरे लिए यह एक निरंतर हाइलाइट कर रहा है जिसे मैंने परिभाषित किया है उदा। ": myvar" तो –

4

, इसकी नहीं एक बहुत बड़ा बयान है, तो सबसे आसान तरीका है डेटा शब्दकोश की जाँच करने के लिए बस है

SQL> select * from xx,abc; 
select * from xx,abc 
       * 
ERROR at line 1: 
ORA-00942: table or view does not exist 


SQL> select owner,table_name from all_tables where table_name in ('XX','ABC'); 

OWNER       TABLE_NAME 
------------------------------ ------------------------------ 
MWATSON      XX 

SQL> 

यह आदर्श है, लेकिन हो रहा है और ट्रेस फ़ाइल की जांच की कोई कमी नहीं है, मुझे यकीन है कि नहीं कर रहा हूँ इसे और कैसे करें।

2

@Matthew

आपका क्वेरी में प्रारंभ है, लेकिन यह काम नहीं कर सकते आप एकाधिक स्कीमा है जब। उदाहरण के लिए, अगर मैं अपने उदाहरण में लॉग इन करता हूं, तो मैंने अपनी सभी टेबल तक पहुंच पढ़ी है। लेकिन अगर मैं स्कीमा के साथ तालिका नाम योग्य नहीं रहा समानार्थी शब्दों के बिना तालिकाओं के लिए एक ORA-00942 मिलेगा:

 
SQL> select * from tools; 
select * from tools 
       * 
ERROR at line 1: 
ORA-00942: table or view does not exist 

तालिका अभी भी all_tables में दिखाई देता है:

 
SQL> select owner, table_name from all_tables where table_name = 'TOOLS'; 

OWNER       TABLE_NAME 
------------------------------ ------------------------------ 
APPLICATION     TOOLS 

@ एरिक्सन क्षमा करें कि बहुत मदद नहीं करता है। मैं मार्क के साथ हूं - मैंने टॉड का इस्तेमाल किया।

13

एसक्यूएल * प्लस आपको वह तालिका बताता है जो मौजूद नहीं है।उदाहरण के लिए:

SQL> select 
    2  * 
    3 from 
    4  user_tables a, 
    5  non_existent_table b 
    6 where 
    7  a.table_name = b.table_name; 
    non_existent_table b 
    * 
ERROR at line 5: 
ORA-00942: table or view does not exist 

यहां यह दिखाता है कि अनुपलब्ध तालिका का नाम और SQL कथन में पंक्ति संख्या जहां त्रुटि होती है।

इसी तरह, एक पंक्ति SQL विवरण में आप तारांकन अज्ञात तालिका के नाम पर प्रकाश डाला देख सकते हैं:

SQL> select * from user_tables a, non_existent_table b where a.table_name = b.table_name; 
select * from user_tables a, non_existent_table b where a.table_name = b.table_name 
          * 
ERROR at line 1: 
ORA-00942: table or view does not exist 

अपने प्रश्न के संदर्भ में, मैं कारण त्रुटि संदेश को शामिल नहीं करता है लगता है तालिका का नाम यह है कि त्रुटि संदेश को स्थिर पाठ होना आवश्यक है। त्रुटि की रेखा में रेखा संख्या और स्थान स्पष्ट रूप से SQL * प्लस (किसी भी तरह) पर वापस भेज दिया गया है।

+5

पर कोई मदद नहीं है यह ठीक है जब आप अपने प्रश्नों का परीक्षण करने के लिए इंटरकैक्टिव रूप से एसक्यूएल * प्लस का उपयोग कर सकते हैं। हालांकि, एक आम मामला तब होता है जब आपके पास केवल हाइबरनेट जैसी दृढ़ता परत का उपयोग करके किसी एप्लिकेशन से लॉग होता है और यह वास्तव में सहसंबंधित करना मुश्किल होता है कि कौन सी क्वेरी निष्पादित की गई हो। – erickson

+2

@ एरिक्सन: यह हाइबरनेट के साथ एक समस्या है;) (बस मजाक कर रहा है) –

+2

@ एरिक्सन: मुझे डर है कि यह पतली जेडीबीसी चालक की सीमा है। ओसीआई कॉल OCIErrorGet एक से अधिक त्रुटि स्ट्रिंग वापस कर सकते हैं। पहला एक मुख्य है अन्य विवरण हैं (एक स्टैकट्रैक की तरह)। आप OCI_ATTR_PARSE_ERROR_OFFSET जैसे विवरण प्राप्त करने के लिए "त्रुटि संभाल" भी पूछ सकते हैं। मुझे जेडीबीसी ड्राइवर एपीआई में कोई भी कोररेंडिंग कॉल नहीं मिल रही है। वैसे भी ओरेकल जेडीबीसी चालक शुद्ध जेनेरिक जेडीबीसी एसक्लएक्सप्शन फेंकता है - ओरेकल विशिष्ट कुछ भी नहीं। – ibre5041

5

मुझे ओरेकल त्रुटि संदेशों को समझने में कभी समस्या नहीं आई है। कारण यह है कि ओरेकल के लिए एसक्यूएल विकसित करने के लिए मैंने जो भी इंटरैक्टिव टूल देखा है, वह उस स्थान को इंगित करता है जहां क्वेरी गलत हो गई थी। यही कारण है कि एसक्यूएल * शामिल इसके अलावा, के रूप में दूसरों का उल्लेख किया है, और पर्ल DBI मॉड्यूल:

$ exec_sql.pl 'select * from daul' 
DBD::Oracle::db prepare failed: ORA-00942: table or view does not exist (DBD ERROR: error possibly near <*> indicator at char 14 in 'select * from <*>daul') [for Statement "select * from daul"] at exec_sql.pl line 68. 

ठीक है, कि थोड़ा कठिन है, क्योंकि यह एक लाइन में सब squished है पढ़ने के लिए। लेकिन एक जीयूआई उपकरण उस टोकन को इंगित करने में सक्षम होगा जहां ओरेकल को क्वेरी के साथ समस्याएं शुरू हुईं। और एक पार्सर पर थोड़ा सा काम दिया, आप अपमानजनक तालिका को चुनने के लिए एक उपकरण लिख सकते हैं।

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

कभी-कभी टेबल नाम समेत भ्रामक होगा। बस जानते हुए भी जहां चीजें गलत हो गया एक विशाल मदद हो सकता है:

SQL> select * from where dummy = 'X'; 
select * from where dummy = 'X' 
       * 
ERROR at line 1: 
ORA-00903: invalid table name 

के लिए क्यों ओरेकल बात इस तरह से करने के लिए चुना है के रूप में, मैं कुछ अटकलों है:

  1. आईबीएम के लिए त्रुटि संदेश की इस शैली का इस्तेमाल किया सिस्टम आर, जो लैरी एलिसन, बॉब माइनर और एड ओट्स ने ओरेकल वी 2 बनाने के लिए प्रतिलिपि बनाई थी। (पिछड़ा संगतता।)

  2. त्रुटि संख्या और स्थान नैदानिक ​​जानकारी का सबसे छोटा संभव प्रतिनिधित्व है। (पार्सिमनी।)

  3. जैसा कि मैंने ऊपर बताया है, ओरेकल से कनेक्ट होने वाले उपकरणों के निर्माण को सरल बनाने के लिए। (इंटरोऑपरेबिलिटी।)

किसी भी मामले में, मैं तुम्हें यह पता लगाने की जो तालिका मौजूद नहीं है एक डीबीए होने की जरूरत नहीं लगता। आपको बस उचित उपकरण का उपयोग करने की आवश्यकता है। (और अपनी उम्मीदों को समायोजित, मुझे लगता है।)

+1

इनपुट जॉन के लिए धन्यवाद। मैंने यह स्पष्ट नहीं किया, लेकिन मेरे मामले में इन्हें आम तौर पर कोड के कई अलग-अलग परतों के माध्यम से जावा अनुप्रयोगों में सामना करना पड़ता है ... एक वेब ढांचा, एक दृढ़ता पुस्तकालय, जावा डेटाबेस ड्राइवर। इसलिए कभी-कभी यह निर्धारित करने में भी मुश्किल हो सकती है कि कौन सी क्वेरी निष्पादित की जा रही थी, खासकर यदि आप किसी तीसरे समूह द्वारा परीक्षण के दौरान बनाए गए लॉग प्राप्त करने के लिए किसी अन्य समूह के साथ काम कर रहे हैं! हाँ, यह बंदरों की असली बैरल है। – erickson

+0

मैं कहूंगा कि ओरेकल की तुलना में जावा का अधिक आरोप है। ;-) –

+1

बहुत सच है। लेकिन फिर मैंने ओरेकल को दोषी ठहराने की कोशिश नहीं की ... जब तक कि आप यह नहीं मान रहे कि जावा ओआरसीएल है। कुछ quirks के बावजूद, ओरेकल पूर्ण शब्दों में महान है, और "प्रतियोगिता" के बगल में रेखांकित यह बेहतर दिखता है। – erickson

3

कारण 1: बहुभाषी इंटरफ़ेस

अपने डेटाबेस उदाहरण के लिए एक भाषा-विशिष्ट संदेश विन्यास फाइल नहीं है।संदेश वहां से खींचे जाते हैं और शुद्ध संख्यात्मक संस्करण से संख्यात्मक + पाठ संस्करण में अनुवादित होते हैं।

अनुचित रूप से स्वरूपित "% s" स्ट्रिंग के कारण एक रहस्यमय विफलता के रनटाइम पर जोखिम चलाने के बजाए हार्डकोडेड तारों को संभवतः बेहतर माना जाता था।

(। ऐसा नहीं है कि मैं विशेष रूप से, इस पीओवी से सहमत Btw)

कारण 2: सुरक्षा

अभी आप विशेष रूप से अपने आवेदन की आंतरिक कार्यप्रणाली का खुलासा नहीं करते हैं तो आप एक PHP प्रिंट , आदि, ब्राउज़र को ओरेकल त्रुटि संदेश का डंप।

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

(ऊपर अस्वीकरण देखें, मैं त्रुटि में अधिक जानकारी के रूप में अच्छी तरह प्राप्त करने के लिए खुशी होगी।)

+0

[' ओआरए -00 9 32 असंगत डेटाटाइप: अपेक्षित% एस% s मिला है] (http://docs.oracle.com/cd/B10501_01/server.920/a96525/e900.htm#206194) –

5

मैं राय से सहमत नहीं हैं, कि SQL + तुम समझ जो तालिका नाम अस्वीकार्य है की सुविधा देता है। सच है, यह प्रत्यक्ष डीएमएल में मदद करता है, हालांकि इसे पार्स करना बहुत मुश्किल है। लेकिन जब गतिशीलता की बात आती है, तो हमें कोई मदद नहीं मिलती:

SQL> begin 
    2 execute immediate 'insert into blabla values(1)'; 
    3 end; 
    4/
begin 
* 
ERROR at line 1: 
ORA-00942: table or view does not exist 
ORA-06512: at line 2 
संबंधित मुद्दे