IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration Oracle Discussion :

Script oracle pour vider une base de données utilisé dans Bambo lors d'un processus de datapump


Sujet :

Administration Oracle

  1. #1
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Points : 47
    Points
    47
    Par défaut Script oracle pour vider une base de données utilisé dans Bambo lors d'un processus de datapump
    Bonjour,

    Je prépare un script oracle automatisé afin de vider une base de données. Ce script sera utilisé par Bambo lors d'un processus de datapump.

    Jusqquà présent j'effectuais les requêtes suivantes manuellement dans SQL Developer pour vider la base de données avant d'importer le fichier de datapump.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    select 'drop TABLE ' || object_name || ';' from user_objects where object_type = 'TABLE';
     
    select 'drop view ' || object_name || ';' from user_objects where object_type = 'VIEW';
     
    select 'drop INDEX ' || object_name || ';' from user_objects where object_type = 'INDEX';
     
    select 'drop PACKAGE ' || object_name || ';' from user_objects where object_type = 'PACKAGE';
     
    select 'drop TYPE ' || object_name || ';' from user_objects where object_type = 'TYPE';
     
    select 'drop sequence ' || object_name || ';' from user_objects where object_type = 'SEQUENCE';
     
    select 'drop synonym ' || object_name || ';' from user_objects where object_type = 'SYNONYM';
     
    select 'drop PROCEDURE ' || object_name || ';' from user_objects where object_type = 'PROCEDURE';
     
    select 'drop FUNCTION ' || object_name || ';' from user_objects where object_type = 'FUNCTION';
     
    select 'drop DATABASE LINK ' || object_name || ';' from user_objects where object_type = 'DATABASE LINK';
     
    select 'drop JOB ' || object_name || ';' from user_objects where object_type = 'JOB';
     
    select 'drop MATERIALIZED VIEW ' || object_name || ';' from user_objects where object_type = 'MATERIALIZED VIEW';
    J'ai besoin maintenant d'éxécuter ces requêtes automatiquement sans faire d'action manuelle. Je dois donc grâce à ce script vider ces objets: TABLE, VIEW, MATERIALIZED VIEW, INDEX, PACKAGE, TYPE, SEQUENCE, SYNONYM, PROCEDURE, FUNCTION, DATABASE LINK et JOB

    J'ai commencé à créer ce script:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    BEGIN
       FOR cur_rec IN (SELECT object_name, object_type
                       FROM user_objects
                       WHERE object_type IN
                                 ('TABLE',
                                  'VIEW',
                                  'MATERIALIZED VIEW',
                                  'PACKAGE',
                                  'TYPE',
                                  'PROCEDURE',
                                  'FUNCTION',
                                  'SEQUENCE',
                                  'SYNONYM',
                                  'INDEX',
                                  'DATABASE LINK',
                                  'JOB',
                                  '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;
    Mais je ne pense pas qu'il soit optimisé et qu'il résolve les erreurs éventuelles (notamment celles liées aux contraintes)

    Pourriez-vous m'aider avec cela ?

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Si c'est pour un import pourquoi ne laisses-tu pas Data Pump le faire? Il est capable de dropper ou tronquer une table avant de l'importer.

  3. #3
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Bonjour,

    Si c'est pour un import pourquoi ne laisses-tu pas Data Pump le faire? Il est capable de dropper ou tronquer une table avant de l'importer.
    Malheuresement le processus du datapump est une succession de commandes (connection à l'environnement source, creation de la sauvegarde, deplacement du fichier dans l'environnement de destination, connection à l'environnement de destination, changement des droits du fichier, vidage de la DB, import du ficher) et vider la db doit se faire par un script à implémenter dans bambo.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Il faut commencer par supprimer les contraintes "liées", notamment les FOREIGN KEYs

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Il manque les MATERIALIZED VIEW LOG, TRIGGER, JAVA CLASS, TRIGGER, TYPE, DIRECTORY, ...
    (drop table droppe les index associés)
    Pour les jobs :
    dbms_scheduler.drop_job et dbms_job.remove dans des blocs BEGIN/END
    finissez par un 'PURGE RECYCLEBIN'

  6. #6
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    Mars 2003
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2003
    Messages : 448
    Points : 926
    Points
    926
    Par défaut
    Bonjour,

    Normalement, on ne fait jamais cela, à savoir dropper un par un tous les types d'objets d'un user.

    A la place, on exécute un script qui supprime le user, et le recrée :
    - DROP USER <username> CASCADE ;
    - CREATE USER <username> .... ;
    - GRANT ... TO <username> ;

    Bien entendu, il faut être vigilant sur
    - la gestion du mot de passe, surtout si il y a une politique de rotation du mot de passe
    - gérer des objets annexes comme les synonymes publics. Parfois, un script complémentaire d'actions pour recréer ce genre d'objets est nécessaire
    - les privilèges système dont on doit disposer pour supprimer et recréer le user, privilèges dont aura besoin le user de connexion sous lequel s'exécutera ce script lancé par Bambo

    Est-ce que cela serait envisageable pour vous ?

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par rouardg Voir le message
    Normalement, on ne fait jamais cela, à savoir dropper un par un tous les types d'objets d'un user.
    Si, dans les environnements de développement où le développeur n'a pas nécessairement les droits pour...
    ils peuvent ainsi remettre à zéro leurs schémas perso sans emm... le DBA.

    et pour le DROP TABLE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DROP TABLE ... CASCADE CONSTRAINTS PURGE

Discussions similaires

  1. Script vbs pour modifier une base mdb
    Par thb911 dans le forum VBScript
    Réponses: 4
    Dernier message: 29/06/2020, 15h35
  2. Script NANT accédant à une base oracle
    Par jBesnard dans le forum EDI/Outils
    Réponses: 3
    Dernier message: 10/10/2012, 13h36
  3. Réponses: 7
    Dernier message: 18/02/2008, 14h33
  4. Quelle bibliothèque pour attaquer une base de données Oracle ?
    Par traoreefo dans le forum Interfaces de programmation
    Réponses: 2
    Dernier message: 10/01/2008, 10h04
  5. [FW2.0] outils pour attaquer une base Oracle et SQLServer
    Par bossun dans le forum Accès aux données
    Réponses: 6
    Dernier message: 22/11/2005, 14h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo