सभी उपयोगकर्ता तालिकाओं को कैसे छोड़ें?


160

मैं ओरेकल में सभी उपयोगकर्ता तालिकाओं को कैसे छोड़ सकता हूं?

मुझे अड़चन है। जब मैं सभी को अक्षम कर देता हूं तब भी यह संभव नहीं है।


उन्हें अक्षम करने के बजाय बाधाओं को छोड़ने के बारे में कैसे?
डेविड एल्ड्रिज

जवाबों:


294
BEGIN
   FOR cur_rec IN (SELECT object_name, object_type
                   FROM user_objects
                   WHERE object_type IN
                             ('TABLE',
                              'VIEW',
                              'MATERIALIZED VIEW',
                              'PACKAGE',
                              'PROCEDURE',
                              'FUNCTION',
                              'SEQUENCE',
                              'SYNONYM',
                              'PACKAGE BODY'
                             ))
   LOOP
      BEGIN
         IF cur_rec.object_type = 'TABLE'
         THEN
            EXECUTE IMMEDIATE 'DROP '
                              || cur_rec.object_type
                              || ' "'
                              || cur_rec.object_name
                              || '" CASCADE CONSTRAINTS';
         ELSE
            EXECUTE IMMEDIATE 'DROP '
                              || cur_rec.object_type
                              || ' "'
                              || cur_rec.object_name
                              || '"';
         END IF;
      EXCEPTION
         WHEN OTHERS
         THEN
            DBMS_OUTPUT.put_line ('FAILED: DROP '
                                  || cur_rec.object_type
                                  || ' "'
                                  || cur_rec.object_name
                                  || '"'
                                 );
      END;
   END LOOP;
   FOR cur_rec IN (SELECT * 
                   FROM all_synonyms 
                   WHERE table_owner IN (SELECT USER FROM dual))
   LOOP
      BEGIN
         EXECUTE IMMEDIATE 'DROP PUBLIC SYNONYM ' || cur_rec.synonym_name;
      END;
   END LOOP;
END;
/

1
यह इस बात पर निर्भर करता है कि आप क्या करने का इरादा रखते हैं। आप ड्रॉप यूजर कैस्केड का भी उपयोग कर सकते हैं लेकिन आपको उपयोगकर्ता को फिर से बनाने की आवश्यकता है।
हेनरी गाओ

1
इसने बहुत अच्छा काम किया और मुझे अपने उपयोगकर्ता को हटाने और पुनः जोड़ने के लिए Oracle सर्वर पर अधिकार की आवश्यकता नहीं है। वाहवाही। बहुत बढ़िया जवाब।
दिजांगोफ़न

मुझे java.lang.IllegalArgumentException मिलती है: निष्पादन के लिए कोई SQL चयनित नहीं है .. मेरा विचार है कि cur_rec घोषित नहीं किया गया है। इसे कैसे घोषित करें क्योंकि यह कुछ bject_name, object_type से मिलकर बना है?
लिजप डैम

3
मुझे लगता है कि स्क्रिप्ट खतरनाक हो सकती है। यदि आप SYSDBA के रूप में कनेक्टेड हैं तो इससे सभी उपयोगकर्ताओं के सभी तालिकाओं और सभी सिस्टम तालिकाओं को हटा दिया जाता है। व्यवहार में आप पूरे डीबी को हटा देते हैं। सावधान रहे!
जरदो

यह उन उपयोगकर्ताओं के लिए उपयोगी है जिनके पास एक निश्चित स्कीमा की अनुमति है लेकिन विकास के वातावरण में डीबीए की अनुमति नहीं है।
हेनरी गाओ

201

यदि आप बस इसे करने के लिए एक बहुत ही सरल तरीका चाहते हैं .. Heres a script मैंने अतीत में इस्तेमाल किया है

select 'drop table '||table_name||' cascade constraints;' from user_tables;

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

स्रोत: https://forums.oracle.com/forums/thread.jspa?threadID=614090

इसी तरह यदि आप अपनी आवश्यकताओं के अनुरूप तालिकाओं को अधिक से अधिक साफ़ करना चाहते हैं तो निम्नलिखित को संपादित कर सकते हैं

select 'drop '||object_type||' '|| object_name || ';' from user_objects where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION', 'INDEX')

46

मेरे लिए काम करने वाला एक अन्य उत्तर है ( http://snipt.net/Fotinakis/drop-all-tables-and-constraints-within-an-oracle-schema/ पर क्रेडिट )

BEGIN

FOR c IN (SELECT table_name FROM user_tables) LOOP
EXECUTE IMMEDIATE ('DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS');
END LOOP;

FOR s IN (SELECT sequence_name FROM user_sequences) LOOP
EXECUTE IMMEDIATE ('DROP SEQUENCE ' || s.sequence_name);
END LOOP;

END;

ध्यान दें कि यह आपके चलने के तुरंत बाद काम करता है। यह एक स्क्रिप्ट का उत्पादन नहीं करता है जिसे आपको कहीं पेस्ट करने की आवश्यकता है (जैसे अन्य उत्तर यहां)। यह सीधे DB पर चलता है।


1
यह मेरे लिए काम करता है लेकिन मुझे टेबल का नाम लिखना था 'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS'। यह आवश्यक है, यदि तालिका के नाम कम मामले हैं।
16:12

@ यह जानकर अच्छा लगा! मैं केवल ऊपरी केस टेबल का उपयोग करता हूं इसलिए मैंने कभी इसका सामना नहीं किया।
काजानकी

आपकी तालिका का नाम आरक्षित शब्द होने की स्थिति में +1 @ceving की भी आवश्यकता है। इसके अलावा, मैं बयान PURGEके अंत में जोड़ DROPदूँगा।
Грозный

सुझाव के रूप में उद्धरण फिक्स्ड।
काज़नाकी

ORA-24005: अनुचित उपयोगिताओं का उपयोग AQ टेबल पर DDL करने के लिए किया जाता है
Skylar Saveland


12

सबसे सरल तरीका है कि कैस्केड कमांड के साथ वस्तुओं का मालिक उपयोगकर्ता को छोड़ दें।

DROP USER username CASCADE

5
यह सही तरीका नहीं है। यह उपयोगकर्ता को ऑब्जेक्ट बनाने के लिए उपयोगकर्ता को हटाने के लिए एक विधि है, जिसे उपयोगकर्ता को हटाने से पहले उपयोगकर्ता तालिकाओं को हटाने के लिए CASCADE का उपयोग करना पड़ता है। उपयोगकर्ता को हटाना वह प्रश्न नहीं है जो उसने पूछा था।
djangofan

3
यदि स्कीमा बड़ी है तो यह लक्ष्य को बहुत प्रभावी ढंग से पूरा करता है। ऐसा लगता है कि आपके मामले में आपके डीबीए के साथ किसी भी संचार से बचना एक उच्च प्राथमिकता है। मैं उन समाधानों को प्राथमिकता देता हूं जो आपके डीबीए के साथ एक संबंध को बढ़ावा देते हैं - विशेष रूप से यदि आपके पास डीबीए विशेषाधिकार नहीं हैं।
ब्रायन

2
@ आप गलत मानते हैं। कभी-कभी DBA बिल्कुल नहीं होता, या वह किसी अन्य कंपनी में होता है। या सबसे सामान्य मामला - वह आपको वह करने की पहुँच नहीं देगा जिसकी आपको आवश्यकता है।
kazanaki

ओरेकल के लिए नया होने के नाते और मैं MySQL से अधिक परिचित हूं; DB को रीसेट करना मुश्किल लगता है। MySQL में a USERअलग है a DATABASEDROP USER username CASCADEमेरे लिए काम किया। लेकिन MySQL में मुझे बस इतना ही करना होगा DROP DATABASEऔर
बजे

1
यह तालिकाओं सहित पूरे डेटाबेस को छोड़ने के लिए प्रभावी है यदि आपके पास 1 है) डेटाबेस बनाने के लिए सभी सटीक अनुमतियों के साथ एक 'क्रिएट USER' स्क्रिप्ट काम करती है; और 2) उस स्क्रिप्ट को चलाने की अनुमति। यदि आपको बस इतना करना है तो टेबल को छोड़ दें तो अन्य उल्लिखित दृष्टिकोण (@kazanaki) अधिक उपयुक्त हैं।
राणा इयान

7

सबसे आसान तरीका है कि टेबलस्पेस को गिरा दिया जाए और फिर टेबलस्पेस का निर्माण किया जाए। लेकिन मुझे ऐसा नहीं करना था। यह हेनरी के सिवाय इसके समान है कि मैं अपने गुई में परिणाम पर एक कॉपी / पेस्ट करता हूं।

SELECT
  'DROP'
  ,object_type
  ,object_name
  ,CASE(object_type)
     WHEN 'TABLE' THEN 'CASCADE CONSTRAINTS;'
     ELSE ';'
   END
 FROM user_objects
 WHERE
   object_type IN ('TABLE','VIEW','PACKAGE','PROCEDURE','FUNCTION','SEQUENCE')

6
SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' 
FROM user_tables;

user_tables एक सिस्टम टेबल है जिसमें उपयोगकर्ता के सभी टेबल होते हैं, सेलेक्ट क्लॉज प्रत्येक तालिका के लिए एक DROP स्टेटमेंट उत्पन्न करेगा जिसे आप स्क्रिप्ट चला सकते हैं


उद्धरण मत भूलना, अन्यथा आप
निचले

2

Oracle में सभी ऑब्जेक्ट्स निकालने के लिए:

1) गतिशील

DECLARE
CURSOR IX IS
SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE ='TABLE' 
AND OWNER='SCHEMA_NAME';
 CURSOR IY IS
 SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE 
IN ('SEQUENCE',
'PROCEDURE',
'PACKAGE',
'FUNCTION',
'VIEW') AND  OWNER='SCHEMA_NAME';
 CURSOR IZ IS
 SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('TYPE') AND  OWNER='SCHEMA_NAME';
BEGIN
 FOR X IN IX LOOP
   EXECUTE IMMEDIATE('DROP '||X.OBJECT_TYPE||' SCHEMA_NAME.'||X.OBJECT_NAME|| ' CASCADE CONSTRAINT');
 END LOOP;
 FOR Y IN IY LOOP
   EXECUTE IMMEDIATE('DROP '||Y.OBJECT_TYPE||' SCHEMA_NAME.'||Y.OBJECT_NAME);
 END LOOP;
 FOR Z IN IZ LOOP
   EXECUTE IMMEDIATE('DROP '||Z.OBJECT_TYPE||' SCHEMA_NAME.'||Z.OBJECT_NAME||' FORCE ');
 END LOOP;
END;
/

2) स्टेटिक

    SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' FROM user_tables
        union ALL
        select 'drop '||object_type||' '|| object_name || ';' from user_objects 
        where object_type in ('VIEW','PACKAGE','SEQUENCE', 'PROCEDURE', 'FUNCTION')
        union ALL
        SELECT 'drop '
        ||object_type
        ||' '
        || object_name
        || ' force;'
        FROM user_objects
        WHERE object_type IN ('TYPE');

1

कृपया नीचे दिए गए चरणों का पालन करें।

begin
  for i in (select 'drop table '||table_name||' cascade constraints' tb from user_tables) 
  loop
     execute immediate i.tb;
  end loop;
  commit;
end;
purge RECYCLEBIN;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.