Bagaimana cara menjatuhkan semua tabel pengguna?

160

Bagaimana saya bisa menjatuhkan semua tabel pengguna di oracle?

Saya punya masalah dengan kendala. Ketika saya menonaktifkan semua itu masih tidak mungkin.

szaman
sumber
Bagaimana dengan menghilangkan kendala alih-alih menonaktifkannya?
David Aldridge

Jawaban:

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;
/
Henry Gao
sumber
1
itu tergantung pada apa yang ingin Anda lakukan. Anda juga dapat menggunakan drop cascade pengguna tetapi Anda perlu membuat ulang pengguna.
Henry Gao
1
Ini bekerja dengan sangat baik dan tidak mengharuskan saya memiliki otoritas di server Oracle untuk menghapus dan menambahkan kembali pengguna saya. Bravo. Jawaban yang bagus
Djangofan
Saya mendapatkan java.lang.IllegalArgumentException: Tidak ada SQL yang dipilih untuk dieksekusi .. Ide saya adalah bahwa cur_rec tidak dideklarasikan. Bagaimana cara mendeklarasikannya karena ini terdiri dari bject_name, object_type?
bendungan lijep
3
Saya pikir naskahnya bisa berbahaya. Jika Anda terhubung sebagai SYSDBA daripada itu menghapus SEMUA tabel SEMUA pengguna dan juga SEMUA tabel sistem. Dalam praktiknya Anda menghapus seluruh DB. Hati-hati!
Zardo
Ini berguna untuk pengguna yang memiliki izin untuk skema tertentu tetapi bukan izin dba di lingkungan pengembangan.
Henry Gao
201

Jika Anda hanya ingin cara yang sangat sederhana untuk melakukan ini .. Inilah skrip yang saya gunakan di masa lalu

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

Ini akan mencetak serangkaian perintah drop untuk semua tabel dalam skema. Spool hasil dari query ini dan jalankan.

Sumber: https://forums.oracle.com/forums/thread.jspa?threadID=614090

Demikian juga jika Anda ingin menghapus lebih dari tabel, Anda dapat mengedit berikut ini sesuai dengan kebutuhan Anda

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

Jawaban lain yang berhasil bagi saya adalah (kredit untuk 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;

Perhatikan bahwa ini berfungsi segera setelah Anda menjalankannya. Ini TIDAK menghasilkan skrip yang perlu Anda rekatkan di suatu tempat (seperti jawaban lain di sini). Ini berjalan langsung pada DB.

Kazanaki
sumber
1
Ini bekerja untuk saya tetapi saya harus mengutip nama tabel dengan menulis 'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS'. Ini perlu, jika nama tabel huruf kecil.
ceving
@veving senang mengetahui hal ini! Saya hanya menggunakan tabel huruf besar sehingga saya tidak pernah menemui ini.
kazanaki
+1 @ceving juga perlu jika nama tabel Anda adalah kata yang dipesan. Juga, saya tambahkan PURGEdi akhir DROPpernyataan.
Грозный
Memperbaiki kutipan sesuai saran yang disarankan.
kazanaki
ORA-24005: Utilitas yang tidak pantas digunakan untuk melakukan DDL di atas meja AQ
Skylar Saveland
21
begin
  for i in (select 'drop table '||table_name||' cascade constraints' tbl from user_tables) 
  loop
     execute immediate i.tbl;
  end loop;
end;
Md. Maksud Alam
sumber
12

Cara paling sederhana adalah dengan menjatuhkan pengguna yang memiliki objek dengan perintah kaskade.

DROP USER username CASCADE
Brian
sumber
5
Ini bukan metode yang tepat. Ini adalah metode untuk menghapus pengguna ketika pengguna telah membuat objek, yang mengharuskan menggunakan CASCADE untuk menghapus tabel pengguna sebelum pengguna dihapus. Menghapus pengguna bukan pertanyaan yang ditanyakannya.
Djangofan
3
Itu mencapai tujuan sangat efektif khususnya jika skema besar. Sepertinya dalam kasus Anda menghindari komunikasi dengan DBA Anda adalah prioritas tinggi. Saya lebih suka solusi yang menumbuhkan hubungan dengan DBA Anda - khususnya jika Anda tidak memiliki hak istimewa DBA.
Brian
2
@Brian Anda anggap salah. Terkadang tidak ada DBA sama sekali, atau dia ada di perusahaan lain. Atau kasus yang paling umum - dia tidak akan memberi Anda akses untuk melakukan apa yang Anda butuhkan.
kazanaki
Menjadi orang baru di Oracle dan saya lebih akrab dengan MySQL; mereset DB sepertinya sulit. DI MySQL aUSER terpisah untuk a DATABASE. DROP USER username CASCADEbekerja untukku. Tetapi di MySQL yang harus saya lakukan adalah DROP DATABASEdan membuat yang baru
gawpertron
1
Ini efektif untuk menghapus seluruh database termasuk tabel jika Anda memiliki 1) skrip 'CREATE USER' berguna dengan semua izin yang tepat untuk membuat ulang database; dan 2) izin untuk menjalankan skrip itu. Jika semua yang perlu Anda lakukan adalah drop table maka pendekatan lain yang disebutkan (@kazanaki) lebih tepat.
Rana Ian
7

Cara termudah adalah dengan menjatuhkan tablespace lalu membangun tablespace kembali. Tapi saya lebih suka tidak harus melakukan itu. Ini mirip dengan Henry kecuali saya hanya melakukan copy / paste pada resultset di gui saya.

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')
TJR
sumber
6
SELECT 'DROP TABLE "' || TABLE_NAME || '" CASCADE CONSTRAINTS;' 
FROM user_tables;

user_tables adalah tabel sistem yang berisi semua tabel pengguna klausa SELECT akan menghasilkan pernyataan DROP untuk setiap tabel Anda dapat menjalankan skrip

ANiket Chavan
sumber
jangan lupa tanda kutip, jika tidak Anda tidak dapat menghapus tabel dengan huruf kecil
masterxilo
2

Untuk menghapus semua objek di oracle:

1) Dinamis

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) Statis

    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');
Vicky yang loyal
sumber
1

Ikuti langkah-langkah di bawah ini.

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;
Lova Chittumuri
sumber