2009-05-09 20 views
17

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

 

create or replace procedure CLEAN_SCHEMA is 
cursor schema_cur is 
select 'drop '||object_type||' '|| object_name|| DECODE(OBJECT_TYPE,'TABLE',' CASCADE CONSTRAINTS;',';') 
from user_objects; 
schema_rec schema_cur%rowtype; 
begin 
select 'drop '||object_type||' '|| object_name|| DECODE(OBJECT_TYPE,'TABLE',' CASCADE CONSTRAINTS;',';') 
into schema_rec 
from user_objects; 
end; 
/
 
+0

उफ़ समर्थित नहीं !!! क्या आप खुद को शूटिंग नहीं कर रहे हैं? हटाने के लिए कर्सर में CLEAN_SCHEMA उठाया जा सकता है। – Guru

उत्तर

2

जब तक उपयोगकर्ता को अनुमतियों को दोबारा अनुमति देने में कठिनाई न हो, तो उपयोगकर्ता को बस छोड़ना और उन्हें फिर से बनाना आसान हो सकता है।

+0

उपयोगकर्ता को छोड़ना अभी एक विकल्प नहीं है। – NMan

1

आपको जो मिला है वह अच्छी शुरुआत है।

यहाँ बाकी है:

  • आप कर्सर और चुनिंदा बयान की है। आपको केवल कर्सर की आवश्यकता है।
  • आपका अगला चरण डायनामिक पीएलएसक्यूएल का उपयोग करके ड्रॉप स्टेटमेंट को कॉल करना है। मैं तत्काल तत्काल कथन का उपयोग करूंगा। आप जिस चीज को छोड़ रहे हैं उसका नाम चुनने के लिए यह और अधिक सुरुचिपूर्ण और प्रीफॉर्मेंस अनुकूल है और इसे तुरंत बाध्य चर के रूप में सबमिट करें।
  • स्कीमा की ऑब्जेक्ट्स को कॉल करने के लिए विधि को कॉल करने के लिए और विधि के स्वामित्व वाली स्कीमा नहीं है जिसे आपको "AUTHID CURRENT_USER" का उपयोग करना है। अधिक जानकारी के लिए the Oracle documentation देखें।
  • अन्य चीजें छोड़: संकुल, काम करता है, प्रक्रियाओं (प्रणाली की संभावना तो रखती हूँ समय-समाप्त करता है, तो आप इस विधि अपनी चल रहा है, जबकि ड्रॉप करने की कोशिश), जावा वर्गों, ट्रिगर, विचार, प्रकार

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

1

आप करीब हैं - जैसा कि किसी और ने नोट किया है कि आपको कथन के लिए "तत्काल तत्काल" की आवश्यकता है। आप पर विचार करना चाहिए:

  • इसके बजाय यह करने के लिए एक प्रक्रिया बनाने के बजाय, एक गुमनाम PL/SQL ब्लॉक के रूप में इस चलाने ताकि आप एक प्रक्रिया चल रहा है ड्रॉप करने की कोशिश के मुद्दे नहीं है।

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

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

  • यदि आप ओरेकल एडवांस्ड क्यूइंग का उपयोग करते हैं तो इससे संबंधित ऑब्जेक्ट्स को एक्यू पैकेज एपीआई कॉल के साथ छोड़ दिया जाना चाहिए। यद्यपि आप नियमित ड्रॉप टेबल के साथ कतार समर्थन के लिए ओरेकल द्वारा जेनरेट की गई टेबल को छोड़ सकते हैं, फिर भी आप संबंधित कतारों को छोड़ने और न ही उन्हें वापस जोड़ने में सक्षम होने के बाद कैच -22 स्थिति में पाएंगे।10g संस्करण अप करने के लिए कम से कम आप भी एक विशेष मोड में डेटाबेस डाले बिना युक्त स्कीमा नहीं छोड़ सकता है जब इस स्थिति

13
declare 
    cursor ix is 
    select * 
     from user_objects 
    where object_type in ('TABLE', 'VIEW', 'FUNCTION', 'SEQUENCE'); 
begin 
for x in ix loop 
    execute immediate('drop '||x.object_type||' '||x.object_name); 
end loop; 
end; 
+0

यह मेरे लिए काम करता है – Ewerton

+0

rror की रिपोर्ट: ORA-00933: SQL आदेश ठीक से नहीं समाप्त हो गया ORA-06512: लाइन 8 पर 00933. 00000 - "एसक्यूएल आदेश ठीक से नहीं समाप्त हो गया" – Suyash

+0

बस एक टिप्पणी: इसके साथ काम करने के लिए 'जावा स्रोत' प्रकार, किसी को ऑब्जेक्ट_नाम को दोबारा उद्धृत करना चाहिए, क्योंकि उनमें विशेष वर्ण हो सकते हैं जिन्हें उद्धरण की आवश्यकता होती है (उदाहरण के लिए/2bbec77c_JsonEncoding)। इस छोटे (लेकिन आवश्यक) संशोधन के अलावा, यह बहुत अच्छा काम करता है। धन्यवाद! – ddevienne

18
create or replace 
FUNCTION    DROP_ALL_SCHEMA_OBJECTS RETURN NUMBER AS 
PRAGMA AUTONOMOUS_TRANSACTION; 
cursor c_get_objects is 
    select object_type,'"'||object_name||'"'||decode(object_type,'TABLE' ,' cascade constraints',null) obj_name 
    from user_objects 
    where object_type in ('TABLE','VIEW','PACKAGE','SEQUENCE','SYNONYM', 'MATERIALIZED VIEW') 
    order by object_type; 
cursor c_get_objects_type is 
    select object_type, '"'||object_name||'"' obj_name 
    from user_objects 
    where object_type in ('TYPE'); 
BEGIN 
    begin 
    for object_rec in c_get_objects loop 
     execute immediate ('drop '||object_rec.object_type||' ' ||object_rec.obj_name); 
    end loop; 
    for object_rec in c_get_objects_type loop 
     begin 
     execute immediate ('drop '||object_rec.object_type||' ' ||object_rec.obj_name); 
     end; 
    end loop; 
    end; 
    RETURN 0; 
END DROP_ALL_SCHEMA_OBJECTS; 

अस्तित्व में ऊपर समारोह बनाएँ (स्वायत्त तो DDL हो सकता है) एक समारोह के माध्यम से कहा जाता तो आप कर सकते हैं:

select DROP_ALL_SCHEMA_OBJECTS from dual; 

जब आप अपने सभी वस्तुओं ड्रॉप करने, सुनिश्चित करें कि आप न proc अपने चल ड्रॉप करने की कोशिश करना चाहते हैं (मैं proc के बारे में न देखभाल रों thats क्यों मुझे नहीं करता है, तो आप सब कुछ आप एक अनाम ब्लॉक

जरूरत है ड्रॉप करना चाहते हैं object_type सूची में procs या कार्यों)

है, लेकिन मैं एक उपकरण है कि केवल ANSI SQL अनुमति से ऐसा करने में सक्षम होने की जरूरत (plsql नहीं) इसलिए एक संग्रहित proc।

आनंद लें।

+0

अच्छी तरह से काम करता है - अच्छी तरह से किया। –

+0

मैं ** एक ** फ़ंक्शन को हटाने के तरीके के बारे में जानने के लिए आया था। मैं जो कुछ भी सीखा वह दोहरा दूंगा क्योंकि कोई भी बताता है कि हटाना कैसे काम करता है। 'तत्काल निष्पादित करें (स्ट्रिंग)' उदा। 'तत्काल निष्पादित करें (' ड्रॉप फंक्शन myStupidFunction ') '~ रिक्त स्थान की जांच करें। – Bitterblue

2

धन्यवाद मार्टिन Brambley,

मुझे लगता है हम निम्नलिखित तरीके से अपने जवाब को आसान बनाने में कर सकते हैं।

CREATE OR REPLACE 
procedure DROP_ALL_SCHEMA_OBJECTS AS 
PRAGMA AUTONOMOUS_TRANSACTION; 
cursor c_get_objects is 
    select object_type,'"'||object_name||'"'||decode(object_type,'TABLE' ,' cascade constraints',null) obj_name 
    FROM USER_OBJECTS 
    where object_type in ('TABLE','VIEW','PACKAGE','SEQUENCE','SYNONYM', 'MATERIALIZED VIEW', 'TYPE') 
    order by object_type; 
BEGIN 
    begin 
    for object_rec in c_get_objects loop 
     execute immediate ('drop '||object_rec.object_type||' ' ||object_rec.obj_name); 
    end loop; 
    end; 
END DROP_ALL_SCHEMA_OBJECTS; 

/

execute DROP_ALL_SCHEMA_OBJECTS; 
1

धन्यवाद मार्टिन Brambley और विजयन श्रीनिवासन!

लेकिन विजयन श्रीनिवासन के संस्करण, सही नहीं है क्योंकि प्रकार 'प्रकार' कुछ समय के दौरान त्रुटियाँ पैदा करता है की निर्भर वस्तुओं उन्हें छोड़:

ORA-02,303: ड्रॉप या प्रकार या तालिका आश्रितों के साथ एक प्रकार का स्थान नहीं ले सकता

मेरे संस्करण अतिरिक्त के साथ स्कीमा से सभी वस्तुओं ड्रॉप:

  • ड्रॉप प्रक्रियाओं और कार्य (उम्मीद 'DROP_ALL_SCHEMA_OBJECTS')
  • ड्रॉप सभी नौकरियों और dbms_jobs
  • ड्रॉप सभी db_links
  • नेस्टेड तालिकाओं ड्रॉप नहीं है, क्योंकि नेस्टेड तालिकाओं के droping
 
CREATE OR REPLACE 
procedure DROP_ALL_SCHEMA_OBJECTS AS 
PRAGMA AUTONOMOUS_TRANSACTION; 
cursor c_get_objects is 
    select uo.object_type object_type_2,'"'||uo.object_name||'"'||decode(uo.object_type,'TABLE' ,' cascade constraints',null) obj_name2 
    FROM USER_OBJECTS uo 
    where uo.object_type in ('TABLE','VIEW','PACKAGE','SEQUENCE','SYNONYM', 'MATERIALIZED VIEW', 'FUNCTION', 'PROCEDURE') 
     and not (uo.object_type = 'TABLE' and exists (select 1 from user_nested_tables unt where uo.object_name = unt.table_name)) 
     and not (uo.object_type = 'PROCEDURE' and uo.object_name = 'DROP_ALL_SCHEMA_OBJECTS') 
    order by uo.object_type; 
cursor c_get_objects_type is 
    select object_type, '"'||object_name||'"' obj_name 
    from user_objects 
    where object_type in ('TYPE'); 
cursor c_get_dblinks is 
    select '"'||db_link||'"' obj_name 
    from user_db_links; 
cursor c_get_jobs is 
    select '"'||object_name||'"' obj_name 
    from user_objects 
    where object_type = 'JOB'; 
cursor c_get_dbms_jobs is 
    select job obj_number_id 
    from user_jobs 
    where schema_user != 'SYSMAN'; 
BEGIN 
    begin 
    for object_rec in c_get_objects loop 
     execute immediate ('drop '||object_rec.object_type_2||' ' ||object_rec.obj_name2); 
    end loop; 
    for object_rec in c_get_objects_type loop 
     begin 
     execute immediate ('drop '||object_rec.object_type||' ' ||object_rec.obj_name); 
     end; 
    end loop; 
    for object_rec in c_get_dblinks loop 
     execute immediate ('drop database link '||object_rec.obj_name); 
    end loop; 
    for object_rec in c_get_jobs loop 
     DBMS_SCHEDULER.DROP_JOB(job_name => object_rec.obj_name); 
    end loop; 
    commit; 
    for object_rec in c_get_dbms_jobs loop 
     dbms_job.remove(object_rec.obj_number_id); 
    end loop; 
    commit; 
    end; 
END DROP_ALL_SCHEMA_OBJECTS; 

/

execute DROP_ALL_SCHEMA_OBJECTS; 
drop procedure DROP_ALL_SCHEMA_OBJECTS; 

exit; 

संबंधित मुद्दे