bonjour,
Comment faire pour supprimer tous les objets d'un chema avec une requete sql
Version imprimable
bonjour,
Comment faire pour supprimer tous les objets d'un chema avec une requete sql
je vous pas supprimer l'utilsateur completement seulement les objets
Si tu le fais à partir de forms, c'est simple:
Code:
1
2
3
4 For Ng In (Select Object_Name, Object_Type from User_Objects) Loop Form_DDL('Drop '||Ng.Object_Type||' '||Ng.Object_Name); End Loop;
Sauf qu'il risque d'être embêté s'il existe des contraintes (FK) entre les tables, où alors il faut désactiver d'abord toutes les contraintes (en 2 temps : d'abord les foreign key, ensuite toutes les autres)
c'est tellement simple et rapide de faire un CREATE USER juste après 8-)Code:DROP USER the_user CASCADE
:alerte: attention avant d'employer ce script
:alerte: il faut avoir un backup de sa base
:alerte: ce script est dynamique et très destructeur et quasi non testé
parfois oui, parfois non.
D'abord, il faut connaitre tous les privileges de l'utilisateur, ensuite, il faut avoir le droit DROP USER, CREATE USER et regénérer tous les droits.
un loop ça me parait être une bonne solution aussi.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 SQL> select object_type,count(*) from user_objects group by object_type OBJECT_TYPE COUNT(*) ------------------- ---------- INDEX 7 PROCEDURE 1 TYPE 6 TABLE 120 DATABASE LINK 1 LOB 1 SQL> purge recyclebin Purge successfully completed. SQL> begin for f in (select table_name from user_tables) loop execute immediate 'drop table "'||f.table_name||'" cascade constraints'; end loop; for f in (select object_type, object_name from user_objects where object_type in ('SEQUENCE','VIEW','FUNCTION','PROCEDURE','PACKAGE','SYNONYM','DATABASE LINK')) loop execute immediate 'drop '||f.object_type||' "'||f.object_name||'"'; end loop; for f in (select type_name from user_types) loop execute immediate 'drop type "'||f.type_name||'" force'; end loop; end; PL/SQL procedure successfully completed. SQL> select count(*) from user_objects COUNT(*) ---------- 0
bon, c'est pas "simple" et ça demande quelques efforts de programmation et de maintenance pour ne rien manquer, mais c'est plus portable que drop user, ça ne demande pas de privilege spécial et c'est plus sûr, car on ne change ni le mot de passe ni le quota ni le rôle ni l'historique des mots de passes et des tentatives infractueuses.
Chacun ces goûts.
Moi j'aime bien drop user 8-)
On m'avait donné une astuce il y a quelques années qui consistait à utiliser une fonction d'OEM.
OK, c'est pas du script mais c'est vachement pratique en tout cas...
- On lance OEM et on va sur sa babase là où sont les USERS.
- On fait clic droit sur le vilain et on fait un truc du style "créer comme...", une fenêtre s'ouvre, on la réserve. Faut surtout pas la perdre.
- On fait à nouveau un clic droit sur le vilain et on lui fait la peau.
- On revient sur le formulaire qui a un peu refroidi et on ré-entre le nom du compte et le mot de passe.
- Il n'y a plus qu'à valider le Formulaire qui va re-créer le compte à l'identique.
:lol:
Attention, OEM ne connait pas le password du user copié et les privilèges grantés sur des objets d'autres schémas ne sont pas récupéré... ce n'est donc pas super non plus.
En revanche, on doit pouvoir trouver un contournement avec import ROWS=N :koi:
En effet, il faut donc le récupérer avant sous sa forme fantôme.Citation:
OEM ne connait pas le password du user copié
Et ensuite il convient de le remettre.Code:
1
2 select password from dba_users where username='xxx'; A1B2C3D4...
Par contre pour les objets grantés je savais pas. Cela ne m'a pas posé de problèmes jusqu'ici étant donné que la plus part de mes bases ont été cloisonnées mono-compte...Code:alter user xxx identified by values 'A1B2C3D4...';
8-)
Ca c'est du 10g et plus vieux. Dans 11g, il n'y a plus de passwords dans dba_users
http://laurentschneider.com/wordpres...es-in-11g.html
Ensuite, il y a les quotas, les accomptes qui sont bloqués, les tablespaces temp et data par défaut, et pleins d'autres subtilités qui font qu'à la fin la solution de facilité n'est plus si facile 8-)
Vu comme ça, je dis également vive le script de purge...
:lol:
Voui, sauf que si le script de création du user est convenablement archivé, il est effectivement simple et rapide de le rejouer.
C'est tout de même prudent d'avoir toujours un script de création du user sous le coude, rien que pour pouvoir le dupliquer ou pour le recréer rapidement.
Je ne connais pas de manière automatique pour récupérer un script complet, il manque toujours des droits, donc je mets le script à jour à la main.
Et c'est bien plus simple pour créer ensuite un environement de dev ou preprod, rapidement...
Enfin, chacun sa méthode...
Je rejoins l'idée d'orafrance sur l'export du user sans les données pour être sûr de ne rien oublier
En plus l'import avec "imp ... show=y" ça permet de récupérer le script complet de recréation du user si on veut le recréer à la main plutôt qu'avec l'import 8-)