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 :

Modification de structure de tables partitionnées


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut Modification de structure de tables partitionnées
    Bonjour à tous.

    J'ai un petit souci avec la manipulation des partitions, que je ne maîtrise pas encore.

    J'ai des tables ayant une colonne en Number(3). Pour une évolution, cette colonne doit passer en Number(5).
    Pour modifier le type Number, la colonne doit être vide. Voici comment je pensais faire pour chaque table:
    - je crée une colonne temporaire pour préserver les données
    - je vide la colonne initiale et la modifie en Number(5)
    - je recopie et supprime la colonne temporaire.

    Problème: certaines tables sont partitionnées précisément sur cette colonne, et je ne peux pas changer son type.
    --> je supprime les partitions... sauf que je dois en laisser une (ORA-14083).

    En dehors du fait que je ne comprends pas pourquoi on ne peut pas supprimer toutes les partitions d'une table, je ne vois pas comment résoudre mon problème à part recréer de nouvelles tables (et partitions) et supprimer les anciennes.

    Merci de m'éclairer sur le sujet.

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Au moins une bonne nouvelle : pour les tables non partitionnées, vous avez parfaitement le droit d'élargir la colonne sans qu'elle soit vide.

    C'est effectivement sur les tables partitionnées que ça pose problème.
    Pour celles-là, DBMS_REDEFINITION me semble être la bonne piste.

    Et si besoin, des idées chez Tom Kyte qui aborde justement l'erreur ORA-14060 : http://asktom.oracle.com/pls/asktom/...:1392403659992

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par GoLDoZ Voir le message
    J'ai des tables ayant une colonne en Number(3). Pour une évolution, cette colonne doit passer en Number(5).
    Pour modifier le type Number, la colonne doit être vide.
    Vous êtes sûr ? En 9iR2 et 11gR1 ce n'est pas nécessaire :
    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
    select banner from sys.v_$version;
     
    BANNER                                                          
    ----------------------------------------------------------------
    Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production      
    PL/SQL Release 9.2.0.8.0 - Production                           
    CORE	9.2.0.8.0	Production                                       
    TNS for 32-bit Windows: Version 9.2.0.8.0 - Production          
    NLSRTL Version 9.2.0.8.0 - Production     
     
    create table toto (col number(3));
    -- Table created.
     
    insert into toto (col) values (123);
    -- 1 row created.
     
    insert into toto (col) values (12345);
    -- ORA-01438: valeur incohérente avec la précision indiquée pour cette colonne
     
    alter table toto modify col number(5);
    -- Table altered.
     
    insert into toto (col) values (12345);
    -- 1 row created.
     
    commit;
    -- Commit complete.
     
    select * from toto;
     
           COL
    ----------
           123
         12345
     
    drop table toto;
    -- Table dropped.
    Peut-être à cause de la clef de partition en effet, je n'ai pas testé cela.

    Edit : pas vu la réponse de Pomalaix le temps de faire le script !

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Pour la modification du type, il est possible que je sois tombé sur une table partitionnée dès le départ. Je vais vérifier.

    Concernant le package dbms_redefinition, je n'ai pas de problème de disponibilité. Pas sûr que ce soit la solution la plus simple (mais si je n'ai pas le choix...).


    Edit: pour la modification du type, effectivement ça fonctionne sur une table non partitionnée.

  5. #5
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Bonjour.

    Je continue le sujet en apportant quelques précisions. Il y a environ 500 tables ayant cette colonne à modifier.
    Pour celles n'étant pas partitionnées, pas de souci donc. Pour les autres, pour l'instant j'envisage la recréation de ces tables (et les index, partitions, etc...).

    J'essaie de concevoir la logique d'exécution dans un script PL/SQL dynamique.

    Pour les tables partitionnées:
    - création de la table cible par un 'CREATE TABLE t_cible as SELECT * FROM t_source where rownum<1' --> j'ai la table avec les contraintes sans les données, ni les index, ni les partitions
    - modification du type la colonne en Number(5);
    - création des index --> comment recopier simplement les index?
    - création des partitions --> j'ai récupéré les noms et j'ai des procédures spécifiques pour les créer
    - insertion des données, avec probablement un commit séquentiel car on a jusqu'à 18 millions de lignes par table
    - suppression (ou renommage) des anciennes tables
    - renommage des nouvelles tables

    En gros, je cherche le moyen le plus simple de dupliquer des tables, index, partitions et données comprises.

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Bon, on va faire simple: export/import des tables partitionnées.

Discussions similaires

  1. Transfert de table avec modification de structure
    Par poussinvert dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 27/07/2012, 15h10
  2. Table partitionnée : comment la structurer?
    Par Snipah dans le forum SQL
    Réponses: 7
    Dernier message: 25/02/2011, 11h19
  3. sauvegarder des modifications sur la structure de table
    Par da_latifa dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/04/2010, 15h36
  4. Réponses: 5
    Dernier message: 08/12/2008, 19h01
  5. [DB2]Structure de table
    Par Morphee dans le forum DB2
    Réponses: 12
    Dernier message: 23/10/2003, 15h53

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