मैं ओरेकल एसक्यूएल में एक स्कीमा में सभी तालिकाओं को कैसे सूचीबद्ध करूं?


159

मैं ओरेकल एसक्यूएल में एक स्कीमा में सभी तालिकाओं को कैसे सूचीबद्ध करूं?

जवाबों:


220

किसी अन्य स्कीमा में सभी तालिकाओं को देखने के लिए, आपके पास निम्न सिस्टम विशेषाधिकारों में से एक या अधिक होना चाहिए:

SELECT ANY DICTIONARY
(SELECT | INSERT | UPDATE | DELETE) ANY TABLE

या बड़ा-हथौड़ा, डीबीए की भूमिका।

उनमें से किसी के साथ, आप चुन सकते हैं:

SELECT DISTINCT OWNER, OBJECT_NAME 
  FROM DBA_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'
   AND OWNER = '[some other schema]'

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

SELECT DISTINCT OWNER, OBJECT_NAME 
  FROM ALL_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'
   AND OWNER = '[some other schema]'

अंत में, आप हमेशा अपनी खुद की तालिकाओं के लिए डेटा शब्दकोश को क्वेरी कर सकते हैं, क्योंकि आपके टेबल पर आपके अधिकारों को रद्द नहीं किया जा सकता है (10 ग्राम के रूप में):

SELECT DISTINCT OBJECT_NAME 
  FROM USER_OBJECTS
 WHERE OBJECT_TYPE = 'TABLE'

2
"सबसे पूर्ण उत्तर" इसके %_OBJECTSबजाय इसके उपयोग के अलावा %_TABLES
एपीसी

मुझे 9i में याद है कि विचार% _TABLES में सूचीबद्ध होंगे - इसलिए, उदाहरण के लिए, एक स्कीमा को स्वचालित करने की कोशिश करने से DROP TABLE REALLY_A_VIEW CASCADE CONDRAINTS जैसे बयान गलतियाँ निकालेंगे। इसलिए आपको या तो MINUS / NOT IN / NOT EXISTS के साथ विचार हटाना होगा या फिर% _OBJECTS जाना होगा। इसके अलावा,% _OBJECTS के खिलाफ जाने से एक और संकेत हो सकता है कि इसमें और क्या हो सकता है!
एडम मस्क

1
DISTINCTक्वेरी में कोई आवश्यकता नहीं है । owner, object_nameमें अद्वितीय हैALL_OBJECTS
a_horse_with_no_name

1
उन सवालों के लिए अलग की जरूरत नहीं है, यह सच है; हालाँकि, owner, object_namedba_objects में किसी भी तरह से अद्वितीय नहीं है; पैकेज निकाय और पैकेज दोनों उस दृश्य में दिखाई देते हैं, और टेबल्स और इंडेक्स विभिन्न नामस्थानों में होते हैं।
एडम मस्क

XE 11.2 में अंतिम क्वेरी काम नहीं करेगी। ऐसा लगता है कि 'user_objects' में कोई 'स्वामी' कॉलम नहीं है।
राफेल चेव्स

71
SELECT table_name  from all_tables where owner = 'YOURSCHEMA';

2
यह केवल आपके सभी तालिकाओं को दिखाएगा यदि आपकाSCHEMA द्वारा चलाया जाता है या एडम मस्क द्वारा उल्लिखित विशेषाधिकारों के साथ एक उपयोगकर्ता द्वारा चलाया जाता है। अन्यथा यह केवल आपके लिए तालिकाओं को दिखाता है जिससे हमें विशेषाधिकार दिए गए हैं।
एपीसी

14

आप क्वेरी कर सकते हैं USER_TABLES

select TABLE_NAME from user_tables

5
आपके स्कीमा की सभी तालिकाएँ, A स्कीमा की सभी तालिकाएँ नहीं हैं। इसके अलावा, * _TABLES डेटा डिक्शनरी व्यूज (DBA_TABLES, ALL_TABLES, USER_TABLES) में व्यूज शामिल हैं।
एडम मस्क

"" के साथ "विचारों को शामिल करें" की जगह ओरेकल के वीर्य संस्करणों में विचार शामिल कर सकते हैं। "
एडम मस्क

@Adam Musch ने Oracle 10g R2 का उपयोग करके परीक्षण किया, यह दृश्य वापस नहीं आया।
सथ्याजीथ भट ११'११

4

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

select * from tab;

3

यह कोशिश करो, बदलें? अपने स्कीमा नाम के साथ

select TABLE_NAME from  INFORMATION_SCHEMA.TABLES
 WHERE TABLE_SCHEMA =?
  AND TABLE_TYPE = 'BASE TABLE'

3
यह अधिक डेटाबेस अज्ञेयवादी है, और इसलिए मुझे लगता है कि इस प्रकार का समाधान सभी विकल्पों पर बेहतर है। मुझे लगता है कि INFORMATION_SCHEMA मेरे द्वारा देखे गए हर प्रमुख डेटाबेस के बारे में काम करता है। हालांकि कुछ जानकारी क्या आप बाहर निकल सकते हैं में कम से कम यह देखने के लिए एक सुसंगत जगह है। हालांकि एक त्वरित इंटरनेट खोज करने से, ऐसा प्रतीत होता है कि ओरेकल केवल एकमात्र डेटाबेस के बारे में है जो Information_Schema का समर्थन नहीं करता, भले ही यह SQL-92 मानक का हिस्सा हो।
किब्बी

2

यदि आप JDBC (Java) के साथ Oracle एक्सेस कर रहे हैं, तो आप DatabaseMetadata क्लास का उपयोग कर सकते हैं । यदि आप ADO.NET के साथ Oracle एक्सेस कर रहे हैं, तो आप एक समान दृष्टिकोण का उपयोग कर सकते हैं।

यदि आप Oracle को ODBC के साथ एक्सेस कर रहे हैं, तो आप SQLTables फ़ंक्शन का उपयोग कर सकते हैं ।

अन्यथा, यदि आपको SQLPlus या इसी तरह के Oracle क्लाइंट में जानकारी की आवश्यकता है, तो पहले से बताए गए प्रश्नों में से एक करेगा। उदाहरण के लिए:

select TABLE_NAME from user_tables

2
select * from cat;

यह user_catalog के आपके स्कीमा कैट पर्याय में सभी तालिकाओं को दिखाएगा


2
select TABLE_NAME from user_tables;

उपरोक्त क्वेरी आपको उस उपयोगकर्ता में मौजूद सभी तालिकाओं के नाम देगी;



1

तालिका का चयन करें_नाम, स्वामी से सभी_ तालिकाएँ जहाँ स्वामी = 'स्कीमा_नाम' तालिका_नाम द्वारा


1

यदि आप स्वामी का नाम जानते हैं तो आप सीधे दूसरी क्वेरी चला सकते हैं।

- यदि आप वहां मौजूद सभी मालिकों का चयन कर सकते हैं:

SELECT DISTINCT(owner) from SYS.ALL_TABLES;

-तब आप उस मालिक के अधीन तालिकाओं को देख सकते हैं:

SELECT table_name, owner from all_tables where owner like ('%XYZ%');


0

यदि आपको तालिका का आकार प्राप्त करने की आवश्यकता है, तो यह आसान होगा:

select SEGMENT_NAME, PARTITION_NAME, BYTES from user_segments where SEGMENT_TYPE='TABLE' order by 1


0

OWNERस्कीमा के तहत सभी तालिकाओं के लिए तालिका और पंक्तियों के काउंटर का नाम :

SELECT table_name, num_rows counter from DBA_TABLES WHERE owner = 'OWNER'

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.