Comment supprimer toutes les tables utilisateur?

160

Comment supprimer toutes les tables utilisateur dans oracle?

J'ai un problème avec les contraintes. Quand je désactive tout, ce n'est toujours pas possible.

Szaman
la source
Que diriez-vous de supprimer les contraintes au lieu de les désactiver?
David Aldridge

Réponses:

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
la source
1
cela dépend de ce que vous avez l'intention de faire. vous pouvez également utiliser drop user cascade, mais vous devez recréer l'utilisateur.
Henry Gao
1
Cela a très bien fonctionné et il n'est pas nécessaire que je sois autorisé sur le serveur Oracle pour supprimer et rajouter mon utilisateur. Bravo. Très bonne réponse.
djangofan
J'obtiens java.lang.IllegalArgumentException: aucun SQL sélectionné pour l'exécution .. Mon idée est que cur_rec n'est pas déclaré. Comment le déclarer puisqu'il s'agit en partie de bject_name, object_type?
lijep dam le
3
Je pense que le script pourrait être dangereux. Si vous êtes connecté en tant que SYSDBA, il supprime TOUTES les tables de TOUS les utilisateurs ainsi que TOUTES les tables système. En pratique, vous supprimez tout le DB. Faites attention!
Zardo
Ceci est utile pour les utilisateurs qui ont une autorisation sur un certain schéma mais pas l'autorisation dba dans l'environnement de développement.
Henry Gao
201

Si vous voulez juste un moyen très simple de le faire .. Voici un script que j'ai utilisé dans le passé

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

Cela imprimera une série de commandes de suppression pour toutes les tables du schéma. Spool le résultat de cette requête et l'exécuter.

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

De même, si vous souhaitez effacer plus de tableaux, vous pouvez modifier les éléments suivants en fonction de vos besoins

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

Une autre réponse qui a fonctionné pour moi est (crédit à 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;

Notez que cela fonctionne immédiatement après son exécution. Il ne produit PAS un script que vous devez coller quelque part (comme d'autres réponses ici). Il s'exécute directement sur la base de données.

Kazanaki
la source
1
Cela fonctionne pour moi mais j'ai dû citer le nom de la table en écrivant 'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS'. Cela est nécessaire si les noms de table sont en minuscules.
ceving
@ceving agréable de le savoir! Je n'utilise que des tableaux en majuscules, donc je n'ai jamais rencontré cela.
kazanaki
+1 @ceving est également nécessaire au cas où le nom de votre table serait un mot réservé. Aussi, j'ajouterais PURGEà la fin de la DROPdéclaration.
Грозный
Correction des citations comme suggéré.
kazanaki
ORA-24005: Utilitaires inappropriés utilisés pour exécuter DDL sur la table 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
la source
12

Le moyen le plus simple consiste à supprimer l'utilisateur qui possède les objets avec la commande en cascade.

DROP USER username CASCADE
Brian
la source
5
Ce n'est pas la bonne méthode. Il s'agit d'une méthode de suppression d'un utilisateur lorsque l'utilisateur a créé des objets, ce qui nécessite l'utilisation de CASCADE pour supprimer les tables utilisateur juste avant la suppression de l'utilisateur. Supprimer l'utilisateur n'est pas la question qu'il s'est posée.
djangofan
3
Il atteint l'objectif très efficacement, en particulier si le schéma est volumineux. Il semble que dans votre cas, éviter toute communication avec votre DBA est une priorité absolue. Je préfère les solutions qui favorisent une relation avec votre DBA - en particulier si vous ne disposez pas des privilèges DBA.
Brian
2
@Brian vous pensez que vous avez tort. Parfois, il n'y a pas du tout de DBA ou il est dans une autre entreprise. Ou le cas le plus courant - il ne vous donnera pas accès à ce dont vous avez besoin.
kazanaki
Étant nouveau sur Oracle et je suis plus familier avec MySQL; la réinitialisation d'une base de données semble difficile. IN MySQL a USERest distinct de a DATABASE. DROP USER username CASCADEtravaillé pour moi. Mais dans MySQL, tout ce que j'aurais à faire est d'en DROP DATABASEcréer un nouveau
gawpertron
1
Ceci est efficace pour supprimer toute la base de données, y compris les tables, si vous avez 1) un script 'CREATE USER' à portée de main avec toutes les autorisations exactes pour recréer la base de données; et 2) l'autorisation d'exécuter ce script. Si tout ce que vous avez à faire est de supprimer des tables, d'autres approches mentionnées (@kazanaki) sont plus appropriées.
Rana Ian
7

Le moyen le plus simple serait de supprimer le tablespace, puis de reconstruire le tablespace. Mais je préfère ne pas avoir à faire ça. Ceci est similaire à celui d'Henry sauf que je fais juste un copier / coller sur l'ensemble de résultats dans mon interface graphique.

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

user_tables est une table système qui contient toutes les tables de l'utilisateur la clause SELECT générera une instruction DROP pour chaque table, vous pouvez exécuter le script

ANiket Chavan
la source
n'oubliez pas les guillemets, sinon vous ne pouvez pas supprimer les tableaux avec des lettres minuscules
masterxilo
2

Pour supprimer tous les objets dans oracle:

1) Dynamique

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

    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');
Goyal Vicky
la source
1

Veuillez suivre les étapes ci-dessous.

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
la source