すべてのユーザーテーブルを削除する方法


回答:


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ダム2017

3
スクリプトは危険だと思います。SYSDBAとして接続している場合は、すべてのユーザーのすべてのテーブルとすべてのシステムテーブルが削除されます。実際には、DB全体を削除します。注意してください!
Zardo

これは、ユーザーが特定のスキーマに対する権限を持っているが、開発環境ではdba権限を持っていない場合に役立ちます。
Henry 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;

これは、実行した直後に機能することに注意してください。どこかに貼り付ける必要があるスクリプトは生成されませ(ここでの他の回答のように)。DBで直接実行されます。


1
これは私にとってはうまくいきますが、私は書くことによってテーブル名を引用しなければなりませんでした'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS'。これは、テーブル名が小文字の場合に必要です。
ceving

@cevingこれを知って嬉しい!私は大文字のテーブルのみを使用するので、これに遭遇したことはありません。
kazanaki

テーブル名が予約語の場合は、+ 1 @cevingも必要です。また、ステートメントのPURGE最後に追加しDROPます。
Грозный

引用符が推奨されるように修正されました。
kazanaki 14

ORA-24005:AQテーブルでDDLを実行するために不適切なユーティリティが使用されました
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

最も簡単な方法は、cascadeコマンドを使用してオブジェクトを所有するユーザーを削除することです。

DROP USER username CASCADE

5
これは正しい方法ではありません。これは、ユーザーがオブジェクトを作成したときにユーザーを削除する方法です。ユーザーを削除する直前にCASCADEを使用してユーザーテーブルを削除する必要があります。ユーザーを削除することは、ユーザーが尋ねた質問ではありません。
djangofan 2011年

3
特にスキーマが大きい場合、非常に効果的に目標を達成します。あなたの場合、DBAとの通信を避けることが最優先事項のようです。特にDBA特権がない場合は、DBAとの関係を促進するソリューションを好みます。
ブライアン、

2
@ブライアン、あなたは間違っていると思います。DBAがいない場合や、別の会社にいる場合もあります。または最も一般的なケース-彼はあなたにあなたが必要とすることをするためのアクセス権を与えません。
kazanaki

オラクルは初めてで、MySQLに慣れています。DBのリセットは難しいようです。MySQLではaはとUSERは別DATABASEです。DROP USER username CASCADE私のために働いた。しかし、MySQLでは、すべて私がやってされなければならないDROP DATABASEと新しいものを作成する
gawpertron

1
これは、次の場合にテーブルを含むデータベース全体を削除するのに効果的です。1)データベースを再作成するためのすべての正確な権限を持つ「CREATE USER」スクリプトが便利です。2)そのスクリプトを実行する権限。テーブルを削除する必要がある場合は、他の方法(@kazanaki)がより適切です。
Rana Ian

7

最も簡単な方法は、テーブルスペースを削除してから、テーブルスペースを再構築することです。しかし、私はむしろそうする必要はありません。これはヘンリーと似ていますが、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.