จะวางตารางผู้ใช้ทั้งหมดได้อย่างไร


160

ฉันจะวางตารางผู้ใช้ทั้งหมดใน oracle ได้อย่างไร

ฉันมีปัญหากับข้อ จำกัด เมื่อฉันปิดการใช้งานทั้งหมดมันยังคงเป็นไปไม่ได้


วิธีการเกี่ยวกับการลดข้อ จำกัด แทนการปิดการใช้งานพวกเขา?
David Aldridge

คำตอบ:


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
ขึ้นอยู่กับสิ่งที่คุณตั้งใจจะทำ คุณสามารถใช้ผู้ใช้แบบหล่นได้ แต่คุณต้องสร้างผู้ใช้ใหม่
Henry Gao

1
สิ่งนี้ใช้ได้ดีมากและไม่ต้องการให้ฉันมีสิทธิ์บนเซิร์ฟเวอร์ Oracle ในการลบและเพิ่มผู้ใช้ของฉันอีกครั้ง ไชโย คำตอบที่ดี
djangofan

ฉันได้รับ java.lang.IllegalArgumentException: ไม่มีการเลือก SQL สำหรับการดำเนินการ .. ความคิดของฉันคือ cur_rec นั้นไม่ได้ถูกประกาศ จะประกาศอย่างไรตั้งแต่นี้มีบางส่วนประกอบด้วย bject_name, object_type
เขื่อน lijep

3
ฉันคิดว่าสคริปต์อาจเป็นอันตรายได้ หากคุณเชื่อมต่อเป็น SYSDBA มากกว่าที่จะลบตารางทั้งหมดของผู้ใช้ทั้งหมดและตารางระบบทั้งหมด ในทางปฏิบัติคุณลบ DB ทั้งหมด ระวัง!
Zardo

สิ่งนี้มีประโยชน์สำหรับผู้ใช้ที่มีสิทธิ์ใน schema บางอย่าง แต่ไม่ใช่สิทธิ์ dba ในสภาพแวดล้อมการพัฒนา
เฮนรี Gao

201

หากคุณต้องการวิธีง่ายๆในการทำเช่นนี้ .. เป็นสคริปต์ที่ฉันเคยใช้ในอดีต

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;

โปรดทราบว่าวิธีนี้ใช้งานได้ทันทีหลังจากคุณเรียกใช้ มันไม่ได้ผลิตสคริปต์ที่คุณต้องนำไปวางที่ใดที่หนึ่ง (เช่นคำตอบอื่น ๆ ที่นี่) มันทำงานโดยตรงบนฐานข้อมูล


1
งานนี้สำหรับฉัน 'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS'แต่ฉันต้องพูดชื่อตารางโดยการเขียน นี่เป็นสิ่งจำเป็นหากชื่อตารางเป็นตัวพิมพ์เล็ก
ceving

@ รู้สึกยินดีที่ได้รู้สิ่งนี้! ฉันใช้ตารางตัวพิมพ์ใหญ่เท่านั้นดังนั้นฉันไม่เคยพบสิ่งนี้
kazanaki

+1 @ceving จำเป็นในกรณีที่ชื่อตารางของคุณเป็นคำที่สงวนไว้ นอกจากนี้ฉันจะเพิ่มPURGEในตอนท้ายของDROPคำสั่ง
Грозный

แก้ไขคำพูดตามที่แนะนำ
kazanaki

ORA-24005: ยูทิลิตี้ที่ไม่เหมาะสมที่ใช้ในการแสดง DDL บนตาราง AQ
Skylar Saveland


12

วิธีที่ง่ายที่สุดคือการปล่อยผู้ใช้ที่เป็นเจ้าของวัตถุด้วยคำสั่ง cascade

DROP USER username CASCADE

5
นี่ไม่ใช่วิธีที่ถูกต้อง นี่เป็นวิธีการลบผู้ใช้เมื่อผู้ใช้สร้างวัตถุซึ่งต้องใช้ CASCADE เพื่อลบตารางผู้ใช้ก่อนที่ผู้ใช้จะถูกลบ การลบผู้ใช้ไม่ใช่คำถามที่เขาถาม
djangofan

3
มันบรรลุเป้าหมายได้อย่างมีประสิทธิภาพโดยเฉพาะอย่างยิ่งหากสคีมามีขนาดใหญ่ ดูเหมือนว่าในกรณีของคุณการหลีกเลี่ยงการสื่อสารกับ DBA ของคุณนั้นเป็นเรื่องที่มีความสำคัญสูง ฉันชอบโซลูชันที่ส่งเสริมความสัมพันธ์กับ DBA ของคุณโดยเฉพาะอย่างยิ่งถ้าคุณไม่มีสิทธิ์ DBA
ไบรอัน

2
@Brian คุณคิดว่าผิด บางครั้งก็ไม่มี DBA เลยหรือเขาอยู่ใน บริษัท อื่น หรือกรณีปกติที่สุด - เขาจะไม่ให้คุณเข้าถึงสิ่งที่คุณต้องการ
kazanaki

เป็นสิ่งใหม่สำหรับ Oracle และฉันคุ้นเคยกับ MySQL มากขึ้น การรีเซ็ตฐานข้อมูลดูเหมือนยาก ใน MySQL แยกออกไปUSER ทำงานให้ฉัน แต่ใน MySQL ทั้งหมดที่ฉันจะต้องทำคือการและสร้างขึ้นมาใหม่DATABASEDROP USER username CASCADEDROP DATABASE
gawpertron

1
วิธีนี้มีประสิทธิภาพในการปล่อยฐานข้อมูลทั้งหมดรวมถึงตารางหากคุณมี 1) สคริปต์ 'CREATE USER' มีประโยชน์พร้อมสิทธิ์ที่ถูกต้องทั้งหมดในการสร้างฐานข้อมูลใหม่ และ 2) การอนุญาตให้เรียกใช้สคริปต์ หากสิ่งที่คุณต้องทำคือวางตารางวิธีการที่กล่าวถึงอื่น ๆ (@kazanaki) จะเหมาะสมกว่า
Rana Ian

7

วิธีที่ง่ายที่สุดคือการวาง tablespace จากนั้นสร้าง tablespace สำรอง แต่ฉันไม่ต้องการทำเช่นนั้น สิ่งนี้คล้ายกับของ Henry ยกเว้นว่าฉันเพิ่งทำสำเนา / วางบน resultset ใน gui ของฉัน

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 เป็นตารางระบบที่มีตารางทั้งหมดของผู้ใช้ส่วนคำสั่ง SELECT จะสร้างคำสั่ง DROP สำหรับทุกตารางที่คุณสามารถเรียกใช้สคริปต์


อย่าลืมเครื่องหมายคำพูดมิฉะนั้นคุณจะไม่สามารถลบตารางด้วยตัวอักษรตัวพิมพ์เล็ก
masterxilo

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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.