Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Administration
Administration Forum d'entraide sur l'administration du serveur Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/01/2011, 17h17   #1
Membre éprouvé
 
Inscription : septembre 2004
Messages : 465
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 465
Points : 412
Points : 412
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.
GoLDoZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 17h38   #2
Rédacteur
 
Inscription : décembre 2002
Messages : 2 385
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 385
Points : 3 261
Points : 3 261
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
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 17h47   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 :
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 !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 18h00   #4
Membre éprouvé
 
Inscription : septembre 2004
Messages : 465
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 465
Points : 412
Points : 412
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.
GoLDoZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 09h51   #5
Membre éprouvé
 
Inscription : septembre 2004
Messages : 465
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 465
Points : 412
Points : 412
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.
GoLDoZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 16h48   #6
Membre éprouvé
 
Inscription : septembre 2004
Messages : 465
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 465
Points : 412
Points : 412
Bon, on va faire simple: export/import des tables partitionnées.
GoLDoZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h42.


 
 
 
 
Partenaires

Hébergement Web