172 votes

Comment supprimer toutes les tables des utilisateurs ?

Comment puis-je supprimer toutes les tables des utilisateurs dans Oracle ?

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

0 votes

Pourquoi ne pas supprimer les contraintes au lieu de les désactiver ?

0 votes

307voto

Henry Gao Points 1754
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 votes

Cela dépend de ce que vous avez l'intention de faire. vous pouvez également utiliser la cascade de drop user mais vous devez recréer l'utilisateur.

1 votes

Cela a très bien fonctionné et il n'est pas nécessaire que je dispose de l'autorité sur le serveur Oracle pour supprimer et réinsérer mon utilisateur. Bravo. Excellente réponse.

0 votes

J'obtiens java.lang.IllegalArgumentException : No SQL selected for execution.. Mon idée est que cur_rec n'est pas déclaré. Comment le déclarer puisqu'il s'agit d'un objet composé de bject_name, object_type ?

211voto

khylo Points 1928

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

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

Ceci imprimera une série de commandes de suppression pour toutes les tables du schéma. Spooler 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 que des tableaux, vous pouvez modifier les éléments suivants pour les adapter à vos besoins.

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

1 votes

Cela échouera avec les tables dont les noms sont en minuscules (ou dont les noms commencent par des chiffres ou contiennent des mots-clés). db<>fidèle . Pour résoudre ce problème, la requête devrait être select 'drop table "'||table_name||'" cascade constraints;' from user_tables;

52voto

kazanaki Points 4010

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 l'avoir exécuté. Il fait PAS produire 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.

2 votes

Cela fonctionne pour moi mais j'ai dû citer le nom de la table en écrivant 'DROP TABLE "' || c.table_name || '" CASCADE CONSTRAINTS' . Ceci est nécessaire si les noms des tables sont en minuscules.

0 votes

@ceving c'est bien de le savoir ! Je n'utilise que des tables en majuscules donc je n'ai jamais rencontré ce problème.

0 votes

+1 @ceving également nécessaire au cas où le nom de votre table est un mot réservé. J'ajouterais également PURGE à l'extrémité de la DROP déclaration.

22voto

Md. Maksud Alam Points 81
begin
  for i in (select 'drop table '||table_name||' cascade constraints' tbl from user_tables) 
  loop
     execute immediate i.tbl;
  end loop;
end;

11voto

Brian Points 7072

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

DROP USER username CASCADE

6 votes

Ce n'est pas la bonne méthode. Il s'agit d'une méthode pour supprimer un utilisateur lorsque celui-ci a créé des objets, ce qui nécessite d'utiliser CASCADE pour supprimer les tables de l'utilisateur juste avant la suppression de ce dernier. La suppression de l'utilisateur n'est pas la question qu'il a posée.

3 votes

Il atteint son objectif de manière très efficace, en particulier si le schéma est volumineux. Il semble que dans votre cas, éviter toute communication avec votre DBA soit une priorité élevée. Je préfère les solutions qui favorisent une relation avec votre DBA - en particulier si vous n'avez pas de privilèges de DBA.

2 votes

@Brian vous supposez mal. Parfois, il n'y a pas de DBA du tout, ou il est dans une autre entreprise. Ou encore, dans le cas le plus courant, il ne vous donne pas l'accès nécessaire pour faire ce dont vous avez besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X