Tüm kullanıcı tabloları nasıl bırakılır?


Yanıtlar:


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
ne yapmak istediğine bağlı. drop user cascade'i de kullanabilirsiniz, ancak kullanıcıyı yeniden oluşturmanız gerekir.
Henry Gao

1
Bu çok iyi çalıştı ve Oracle sunucusunda kullanıcımı silmek ve yeniden eklemek için yetki sahibi olmamı gerektirmiyor. Bravo. Mükemmel cevap.
djangofan

Java.lang.IllegalArgumentException alıyorum: Yürütme için hiçbir SQL seçildi .. Benim fikrim cur_rec bildirilmedi olmasıdır. Bazıları bject_name, object_type'den oluştuğu için nasıl bildirilir?
lijep barajı

3
Bence senaryo tehlikeli olabilir. SYSDBA olarak bağlıysanız, TÜM kullanıcıların TÜM tablolarını ve ayrıca TÜM sistem tablolarını siler. Uygulamada tüm DB'yi silersiniz. Dikkatli ol!
Zardo

Bu, kullanıcıların belirli bir şema iznine sahip olması için yararlıdır, ancak geliştirme ortamında dba iznine sahip değildir.
Henry Gao

201

Sadece bunu yapmak için gerçekten basit bir yol istiyorsanız .. Heres geçmişte kullandığım bir senaryo

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

Bu, şemadaki tüm tablolar için bir dizi bırakma komutu yazdırır. Bu sorgunun sonucunu biriktirin ve çalıştırın.

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

Aynı şekilde tablolardan daha fazlasını temizlemek istiyorsanız, aşağıdakileri ihtiyaçlarınıza göre düzenleyebilirsiniz

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

46

Benim için işe yarayan bir başka cevap da ( http://snipt.net/Fotinakis/drop-all-tables-and-contraints-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;

Bunun, çalıştırıldıktan hemen sonra çalıştığını unutmayın . Bu mu DEĞİL Eğer (burada diğer cevaplar gibi) bir yere yapıştırmak için gereken bir komut dosyası üretir. Doğrudan DB üzerinde çalışır.


1
Bu benim için çalışıyor ama tablo adını yazarak alıntılamak zorunda kaldım 'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS'. Tablo adları küçük harfle yazılmışsa bu gereklidir.
ceving

@ceving bunu bilmek güzel! Ben hiç karşılaşmadım sadece büyük harf tabloları kullanın.
kazanaki

+1 @ceving, tablo adınızın ayrılmış bir kelime olması durumunda da gerekir. Ayrıca, ifadenin PURGEsonuna DROPeklerdim.
Грозный

Ceving'in önerdiği gibi tırnak işaretleri düzeltildi.
kazanaki

ORA-24005: AQ masasında DDL yapmak için kullanılan uygunsuz araçlar
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;

12

En basit yol, nesnelerin sahibi olan kullanıcıyı basamakla komutuyla bırakmaktır.

DROP USER username CASCADE

5
Bu doğru yöntem değil. Bu, kullanıcı nesneleri oluşturduğunda bir kullanıcıyı silmenin bir yöntemidir; bu, kullanıcı silinmeden hemen önce kullanıcı tablolarını silmek için CASCADE kullanılmasını gerektirir. Kullanıcıyı silmek istediği soru değildir.
djangofan

3
Özellikle şema büyükse hedefe çok etkili bir şekilde ulaşır. Durumunuzda DBA'nızla herhangi bir iletişimden kaçınmak yüksek bir öncelik gibi görünüyor. Özellikle DBA ayrıcalıklarına sahip değilseniz, DBA'nızla bir ilişkiyi geliştiren çözümleri tercih ederim.
Brian

2
@Brian yanlış olduğunu varsayıyorsun. Bazen hiç bir DBA yoktur ya da başka bir şirkettedir. Ya da en olağan durum - ihtiyacınız olanı yapmanıza izin vermez.
kazanaki

Oracle için yeni olmak ve MySQL hakkında daha fazla bilgi sahibi olmak; DB'yi sıfırlamak zor görünüyor. MySQL'de a USER, a'dan ayrıdır DATABASE. DROP USER username CASCADEbenim için çalıştı. Ama DROP DATABASE
MySQL'de

1
Bu, 1) veritabanını yeniden oluşturmak için tüm izinleri ile kullanışlı bir 'KULLANICI OLUŞTUR' komut dosyası varsa tablolar dahil tüm veritabanını bırakmak etkilidir; ve 2) bu komut dosyasını çalıştırma izni. Yapmanız gereken tek şey masaları düşürmekse, bahsedilen diğer yaklaşımlar (@kazanaki) daha uygundur.
Rana Ian

7

En kolay yol, tablo alanını bırakmak ve sonra tablo alanını yeniden oluşturmaktır. Ama bunu yapmak istemem. Bu benim GUI sonuç kümesinde bir kopyala / yapıştır yapmak dışında Henry's benzer.

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 deyiminin, komut dosyasını çalıştırabileceğiniz her tablo için bir DROP deyimi oluşturacağı tüm tabloları içeren bir sistem tablosu


tırnak işaretleri unutmayın, aksi takdirde küçük harfli tabloları silemezsiniz
masterxilo

2

Oracle'daki tüm nesneleri kaldırmak için:

1) Dinamik

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

    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

Lütfen aşağıdaki adımları izleyin.

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;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.