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

SQL Oracle Discussion :

Index sur une colonne


Sujet :

SQL Oracle

  1. #1
    Membre confirmé Avatar de logiciel_const
    Inscrit en
    Octobre 2007
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 167
    Par défaut Index sur une colonne
    Bonjour,
    pour modifier la taille d'une colonne [Nom], qui est indexéé ,il fallait que je supprime d'abord tout index, j'ai supprimé un, mais il reste d'autres dont la "Column Expresion" se trouve cette colonne "Uper(Nom)" , est ce que je doit supprimer tous ces index,sinon comment je dois faire?
    Merci

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    pas besoin de supprimer les index normaux.

    Par contre les index de fonctions doivent être supprimés.

    Le message d'erreur (que tu n'as pas donné) est assez clair :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL> alter table t modify (x varchar2(15))
    alter table t modify (x varchar2(15))
    Error at line 9
    ORA-30556: either functional or bitmap join index is defined on the column to be modified
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    30556, 00000, "either functional or bitmap join index is defined on the column to be modified"
    // *Cause : An ALTER TABLE MODIFY COLUMN was issued on a column on which
    //          either a functional index or bitmap join index exists.
    // *Action: Drop the functional or bitmap join index before attempting to modify the column.
    PS: pour trouver les indexes, exécute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select column_expression from USER_IND_EXPRESSIONS where table_name='T';

  3. #3
    Membre confirmé Avatar de logiciel_const
    Inscrit en
    Octobre 2007
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 167
    Par défaut
    Merci pour ta réponse, mais le probleme est que j'ai supprimé manuelment le premier index, et lorsque j'ai voulu creer un enregistrement sur la table contenant cette colonne, impossible d'enregistrer !! pouvez vous me donner le patch exacte pour creer l'index supprimé: NONUNIQUE,ASC , en suite supprimer les autres indexes fonctionnels?
    Merci d'avance

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    quand tu dis "impossible d'enregistrer", tu peux préciser?

    ce que tu peux faire c'est d'abord exporter les indexes, les effacer puis les recréer.

    Pour export un index, utilise TOAD, SQL*Developer, DBMS_METADATA ou tout autre outil. Sans doute est-ce inutile car tu as sûrement le code de création des indexes documenté quelque part

    Ex avec DBMS_METADATA

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SET PAGES 9999 LIN 2000 LONG 1000000 LONGC 2000 HEA off FEED OFF
    EXEC dbms_metadata.set_transform_param(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',TRUE)
    SELECT dbms_metadata.get_ddl('INDEX',INDEX_NAME,user) 
    FROM (
      select distinct index_name 
      from USER_IND_EXPRESSIONS 
      WHERE table_name='T'
    );
    output:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX "SCOTT"."I" ON "SCOTT"."T" (UPPER("X"));
    Pour effacer les indexes, DROP INDEX. Par exemple dynamiquement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    set serverout on size 1000000
    begin 
      for f in (SELECT distinct index_name from USER_IND_EXPRESSIONS WHERE table_name='T') loop
        dbms_output.put_line('DROP INDEX "'||f.index_name||'";');
        -- execute immediate 'DROP INDEX "'||f.index_name||'"';
      end loop; 
    end;
    /
    Tu modifies ta table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE T MODIFY (X VARCHAR2(9))
    Ensuite tu les recrées les index exportés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX "SCOTT"."I" ON "SCOTT"."T" (UPPER("X"));

    PS: Le drop dynamique, attention, si tu te plantes et que tu effaces tout, et bien zut!

  5. #5
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Citation Envoyé par logiciel_const Voir le message
    Bonjour,
    pour modifier la taille d'une colonne [Nom], qui est indexéé ,il fallait que je supprime d'abord tout index, j'ai supprimé un, mais il reste d'autres dont la "Column Expresion" se trouve cette colonne "Uper(Nom)" , est ce que je doit supprimer tous ces index,sinon comment je dois faire?
    Merci
    Voici un exemple simple

    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
    55
     
     mhouri > create table t_fbi as select * from emp;
     
    Table created.
     
     mhouri > desc t_fbi;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     EMPNO                                     NOT NULL NUMBER(4)
     ENAME                                              VARCHAR2(10)
     JOB                                                VARCHAR2(9)
     MGR                                                NUMBER(4)
     HIREDATE                                           DATE
     SAL                                                NUMBER(7,2)
     COMM                                               NUMBER(7,2)
     DEPTNO                                             NUMBER(2)
     
     mhouri > create index id_ename on t_fbi(ename);
     
    Index created.
     
     mhouri > create index id_up_ename on t_fbi(upper(ename));
     
    Index created.
     
     mhouri > alter table t_fbi modify ename varchar2(30);
    alter table t_fbi modify ename varchar2(30)
                             *
    ERROR at line 1:
    ORA-30556: functional index is defined on the column to be modified 
     
     
     mhouri > drop index id_up_ename;
     
    Index dropped.
     
     mhouri > alter table t_fbi modify ename varchar2(30);
     
    Table altered.
     
     mhouri > create index id_up_ename on t_fbi(upper(ename));
     
    Index created.
     
     mhouri >desc t_fbi;
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     EMPNO                                     NOT NULL NUMBER(4)
     ENAME                                              VARCHAR2(30)
     JOB                                                VARCHAR2(9)
     MGR                                                NUMBER(4)
     HIREDATE                                           DATE
     SAL                                                NUMBER(7,2)
     COMM                                               NUMBER(7,2)
     DEPTNO                                             NUMBER(2)
    Vous êtes le seul à connaitre l'index (b-tree, bitmap,etc..) que vous avez accidentellement supprimé. Vous êtes donc le seul à savoir comment le recréér.

    Bien à vous

    Mohamed Houri

Discussions similaires

  1. Création d'index sur une colonne TEXT
    Par AyManoVic dans le forum Requêtes
    Réponses: 2
    Dernier message: 03/08/2010, 00h12
  2. Index sur une colonne VARCHAR2
    Par Milo59000 dans le forum Administration
    Réponses: 31
    Dernier message: 23/09/2009, 11h24
  3. Réponses: 1
    Dernier message: 27/07/2009, 16h11
  4. INDEX sur une colonne qui peut être NULL
    Par dorian53 dans le forum Requêtes
    Réponses: 15
    Dernier message: 29/11/2007, 17h13
  5. Index sur une colonne Date
    Par sjaeger dans le forum Oracle
    Réponses: 11
    Dernier message: 10/11/2005, 14h55

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