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.
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.
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;
/
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.
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.
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 ?
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')
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;
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.
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.
@ceving c'est bien de le savoir ! Je n'utilise que des tables en majuscules donc je n'ai jamais rencontré ce problème.
+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.
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.
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.
@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 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.
0 votes
Pourquoi ne pas supprimer les contraintes au lieu de les désactiver ?
0 votes
dbasupport.com/forums/