web-dev-qa-db-fra.com

Comment supprimer toutes les tables utilisateur?

Comment puis-je supprimer toutes les tables utilisateur dans Oracle?

J'ai des problèmes de contraintes. Quand je désactive tout, ce n'est toujours pas possible.

152
szaman
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;
END;
/
281
Henry Gao

Si vous voulez juste un moyen très simple de faire cela. 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=61409

De même, si vous souhaitez effacer plus que des tables, vous pouvez modifier les éléments suivants pour répondre à vos besoins.

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

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é. Cela ne (PAS) produit un script que vous devez coller quelque part (comme les autres réponses ici). Il fonctionne directement sur la base de données.

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

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

DROP USER username CASCADE
11
Brian

Le moyen le plus simple serait de supprimer le tablespace, puis de le sauvegarder. Mais je préférerais ne pas avoir à faire ça. Ceci est similaire à Henry's sauf que je fais juste un copier/coller sur le jeu 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')
6
TJR
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 sur laquelle vous pouvez exécuter le script.

2
ANiket Chavan

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||' '||X.OBJECT_NAME|| ' CASCADE CONSTRAINT');
 END LOOP;
 FOR Y IN IY LOOP
   EXECUTE IMMEDIATE('DROP '||Y.OBJECT_TYPE||' '||Y.OBJECT_NAME);
 END LOOP;
 FOR Z IN IZ LOOP
   EXECUTE IMMEDIATE('DROP '||Z.OBJECT_TYPE||' '||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');
1
Goyal Vicky