डीबी में सभी स्कीमों को सूचीबद्ध करने के लिए ओरेकल एसक्यूएल क्वेरी


96

मैं हमारे oracle DB पर कुछ अप्रयुक्त स्कीमा हटाना चाहता था।

मैं सभी स्कीमा नामों के लिए कैसे क्वेरी कर सकता हूं?


1
"अप्रयुक्त" की आपकी परिभाषा क्या है?
एपीसी

मैं डेटाम माइग्रेशन प्रोजेक्ट पर काम कर रहा हूं, और हर डेवलपर के पास स्कीमा का अपना सेट है। (कुछ डेवलपर्स ने छोड़ दिया है, और कुछ स्कीमा सेट अब उपयोग नहीं किए जाते हैं)।
vicsz

जवाबों:


130

Sqlplus का उपयोग करना

sqlplus / sysdba के रूप में

Daud:

चुनते हैं * 
Dba_users से

क्या आपको केवल उपयोगकर्ता नाम निम्नलिखित करने चाहिए:

उपयोगकर्ता नाम चुनें 
Dba_users से

1
सुनिश्चित करें कि आपके पास अपने उपयोगकर्ता पर अनुमतियाँ हैं।
विकर्णबटन २

2
@ और: यही कारण है कि मैंने "एक विशेषाधिकार प्राप्त उपयोगकर्ता के रूप में";)
a_horse_with_no_name

@ हार्स माफी मुझे याद आती है।
diagonalbatman

@a_horse_with_no_name का तात्पर्य है कि oracle में एक स्कीमा का अर्थ है कि यह एक उपयोगकर्ता है? मेरा मतलब है एक स्कीमा = उपयोगकर्ता? और उस उपयोगकर्ता के अंतर्गत सभी तालिकाएँ MySQL की तरह ही बनाई गई हैं?
ओसामा अल-बन्ना

66

सबसे अधिक संभावना है, आप चाहते हैं

SELECT username
  FROM dba_users

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

SELECT username
  FROM dba_users u
 WHERE EXISTS (
    SELECT 1
      FROM dba_objects o
     WHERE o.owner = u.username )

यह मानते हुए कि जिसने भी स्कीमा बनाया है, वह डिफ़ॉल्ट तालिकाओं को निर्दिष्ट करने और यह मानने के बारे में समझदार था कि आप उन स्कीमाओं में रुचि नहीं रखते हैं, जो ओरेकल ने वितरित किए हैं, आप उन स्कीमाओं को विधेय पर जोड़कर फ़िल्टर कर सकते हैं default_tablespace, अर्थात

SELECT username
  FROM dba_users
 WHERE default_tablespace not in ('SYSTEM','SYSAUX')

या

SELECT username
  FROM dba_users u
 WHERE EXISTS (
    SELECT 1
      FROM dba_objects o
     WHERE o.owner = u.username )
   AND default_tablespace not in ('SYSTEM','SYSAUX')

ऐसी प्रणाली में आना कोई बहुत असामान्य बात नहीं है, जहां किसी ने गलत तरीके से गैर-प्रणाली उपयोगकर्ता default_tablespaceको दिया हो SYSTEM, हालाँकि, इतना निश्चित हो कि इस तरह से ओरेकल-डिलीवर स्कीमा को फ़िल्टर करने की कोशिश करने से पहले धारणाएं पकड़ लें।


इसे उसी जगह से मिलाएं जहां FeRtoll की क्वेरी से भविष्यवाणी की जाती है और आपके पास SYS या सिस्टम को कोबार (संभावना नहीं है) क्वेरी काफी सुरक्षित होगी।
कार्ल

1
वह किस तरह से अलग है select distinct owner from dba_objects?
दाऊद इब्न करीम

1
अच्छी तरह से एक साफ ओरेकल उदाहरण पर, आपकी क्वेरी, @
डेविड

28
SELECT username FROM all_users ORDER BY username;

2
बहुत उपयोगी है यदि आपके उपयोगकर्ता के विशेषाधिकार नहीं हैं dba_users(उदाहरण के लिए: त्रुटि ORA-00942 : table or view does not exist)
19

1
लेकिन उत्पादन dba_users और all_users के बीच एक ही है?
शैलेश प्रतापवार

8
select distinct owner 
from dba_segments
where owner in (select username from dba_users where default_tablespace not in ('SYSTEM','SYSAUX'));

जैसा कि मैं इसे समझता हूं, यह क्वेरी उन सभी स्कीमाओं को सामने लाएगी जिनमें किसी भी तालिका में शामिल हैं। क्या वह सही है?
एंड्रयू स्पेंसर

1
यह केवल ओरेकल के पुराने संस्करणों में मज़बूती से काम करेगा। आस्थगित खंड निर्माण के साथ एक खंड के बिना एक ऑब्जेक्ट होना संभव है।
जॉन हेलर

4

कैसा रहेगा :

SQL> select * from all_users;

यह सभी उपयोगकर्ताओं / स्कीमों की सूची, उनकी आईडी और डीबी में बनाई गई तारीख वापस करेगा:

USERNAME                          USER_ID CREATED
------------------------------ ---------- ---------
SCHEMA1                         120 09-SEP-15
SCHEMA2                         119 09-SEP-15
SCHEMA3                         118 09-SEP-15

4

नीचे sql उन सभी स्कीमा को सूचीबद्ध करता है जो oracle में होती हैं जो स्थापना के बाद बनाई जाती हैं ORACLE_MAINTAINED = 'N' फ़िल्टर है। यह कॉलम 12 सी में नया है।

अलग-अलग उपयोगकर्ता नाम का चयन करें, dAC_users से ORACLE_MAINTAINED जहाँ ORACLE_MAINTAINED = 'N';

2

निम्न SQL में से कोई भी Oracle DB में सभी स्कीमा लौटाएगा।

  1. select owner FROM all_tables group by owner;
  2. select distinct owner FROM all_tables;

1
ऐसे स्कीमा हो सकते हैं जिनमें केवल गैर-टेबल ऑब्जेक्ट हैं, जिन्हें आपके प्रश्नों को सूचीबद्ध नहीं किया जाएगा।
मैथ्यू मैकपीक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.