Outils personnels

Supprimer tous les objets d'un utilisateur : Différence entre versions

De wikiGite

 
(5 révisions intermédiaires par un autre utilisateur non affichées)
Ligne 1 : Ligne 1 :
On peut forcer l'exécution de DDL (exemple : ajout de droits, suppression de tables, etc..) multiple par ce genre de code :
+
Pour vider complètement le schéma d'un utilisateur (avant réimport par exemple) il convient de vérifier quels types d'objets lui appartiennent (des séquences, des fonctions, entre autres). On peut alors construire quelque chose comme ça sous SQLPLUS (testé sur une 10g) :
 +
set serveroutput on
 +
declare
 +
  u VARCHAR(5) := 'ADM';
 
  begin
 
  begin
   for x in (select table_name from dba_tables where owner='ADM')
+
  DBMS_OUTPUT.ENABLE( 1000000 ) ;
 +
-- Les tables sont a part car la syntaxe du drop est differente
 +
   for x in (select table_name from dba_tables where owner=u)
 
   loop
 
   loop
      execute immediate 'drop table ADM.'||x.table_name||' cascade constraints';
+
    dbms_output.put_line ('Dropping TABLE '||x.table_name);
 +
    execute immediate 'drop table '||u||'.'||x.table_name||' cascade constraints';
 
   end loop;
 
   end loop;
 +
  for x in (select object_name,object_type from dba_objects where owner=u and object_type not in ('LOB','PACKAGE BODY') and object_name not like 'BIN$%')
 +
  loop
 +
    dbms_output.put_line ('Dropping '||x.object_type||' '||x.object_name);
 +
    execute immediate 'drop '||x.object_type||' '||u||'.'||x.object_name;
 +
  end loop;
 
  end;
 
  end;
  
'''Note''' : pour vider complètement le schéma d'un utilisateur (avant réimport par exemple) il convient de vérifier quels types d'objets lui appartiennent (des séquences, des fonctions, entre autres). On peut alors construire quelque chose comme ça :
+
On peut reprendre ce principe et forcer l'exécution de DDL (exemple : ajout de droits, modification de structure en masse, etc..) multiple par ce genre de code :
declare
 
  u VARCHAR(5) := 'RH';
 
 
  begin
 
  begin
   for x in (select table_name from dba_tables where owner=u)
+
   for x in (select table_name from dba_tables where owner='ADM')
  loop
 
    execute immediate 'drop table '||u||'.'||x.table_name||' cascade constraints';
 
  end loop;
 
  for x in (select sequence_name from dba_sequences where sequence_owner=u)
 
  loop
 
    execute immediate 'drop sequence '||u||'.'||x.sequence_name;
 
  end loop;
 
  for x in (select procedure_name,procedure_type from dba_procedures where owner='ADM')
 
 
   loop
 
   loop
    execute immediate 'drop '||procedure_type||' '||u||'.'||x.table_name;
+
      execute immediate 'GRANT SELECT ON ' || x.table_name || ' TO USER_RO';
 
   end loop;
 
   end loop;
 
  end;
 
  end;

Version actuelle datée du 9 décembre 2010 à 15:54

Pour vider complètement le schéma d'un utilisateur (avant réimport par exemple) il convient de vérifier quels types d'objets lui appartiennent (des séquences, des fonctions, entre autres). On peut alors construire quelque chose comme ça sous SQLPLUS (testé sur une 10g) :

set serveroutput on
declare
  u VARCHAR(5) := 'ADM';
begin
  DBMS_OUTPUT.ENABLE( 1000000 ) ;
-- Les tables sont a part car la syntaxe du drop est differente
  for x in (select table_name from dba_tables where owner=u)
  loop
    dbms_output.put_line ('Dropping TABLE '||x.table_name);
    execute immediate 'drop table '||u||'.'||x.table_name||' cascade constraints';
  end loop;
 for x in (select object_name,object_type from dba_objects where owner=u and object_type not in ('LOB','PACKAGE BODY') and object_name not like 'BIN$%')
 loop
   dbms_output.put_line ('Dropping '||x.object_type||' '||x.object_name);
   execute immediate 'drop '||x.object_type||' '||u||'.'||x.object_name;
 end loop;
end;

On peut reprendre ce principe et forcer l'exécution de DDL (exemple : ajout de droits, modification de structure en masse, etc..) multiple par ce genre de code :

begin
  for x in (select table_name from dba_tables where owner='ADM')
  loop
     execute immediate 'GRANT SELECT ON ' || x.table_name || ' TO USER_RO';
  end loop;
end;