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 :

Trigger pour un index


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 45
    Points : 24
    Points
    24
    Par défaut Trigger pour un index
    Bonjour
    je veux faire la mise à jour mon index, aprés chaque insertion dans la table,
    le code est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE OR REPLACE TRIGGER TRIGER11
    AFTER INSERT ON TABLE1
    FOR EACH ROW
    BEGIN
    ALTER INDEX REBUILD ONLINE;
    END;
    /
    il me rend une erreur au début de ALTER
    ou est ma fauteeee

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Votre index se met déjà à jour tout seul !

    Le rebuild est une opération de maintenance, qui n'a rien à faire dans un trigger.

  3. #3
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Votre index se met déjà à jour tout seul !

    Le rebuild est une opération de maintenance, qui n'a rien à faire dans un trigger.
    +1 !

    A la question de départ, à savoir pourquoi une erreur, c'est parce que l'instruction "ALTER INDEX..." est un ordre DDL, et que ces ordres sont interdits dans un bloc PL/SQL. Si on en a vraiment besoin, il faut les "cacher" dans un SQL dynamique :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE IMMEDIATE 'un ordre ddl...';
    Attention, les ordres DDL exécutent un COMMIT implicite avant de s'exécuter. Dans un trigger cela risque fort de poser problème.

  4. #4
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Merci bcp pour vos réponses
    1- Mon index ne se met pas à jour automatqmt, car aprés que j'ai faits 2 autres insertions, mes requetes SQL ne me ramene des données que du premier enregistrement.
    Mais si je le rafraichie manuellement, il les prends en charge.
    2- Je vais essayer avec EXECUTE IMMEDIATE...

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Avez-vous fait un COMMIT après votre insert ?

    Un indice discret ce cache dans ce post quant à la marche à suivre.

  6. #6
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    Question peut-être bête : il ne manquerait pas simplement un COMMIT ?
    Si tu fais tes INSERT dans une session, les données ne sont visibles dans une autre session qu'après COMMIT. Le fait de reconstruire l'index fait un COMMIT, c'est peut-être simplement ça qui résout ton problème.

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    DSl
    j'ai changé comme ça, mais ça n'a pas marché
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE OR REPLACE TRIGGER TRIGER11
    AFTER INSERT ON TABLE1
    FOR EACH ROW
    Begin
    EXEUTE IMMEDIATE INDEX monIndex REBUILD ONLINE;
    End;
    Mais il me signale tjrs Erreur syntaxique sur le mot "ALTER", comme si il n'accepte pas ça.
    Pour le COMMIT: je le fait aprés chaque insertion.

  8. #8
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    EXECUTE IMMEDIATE prend un chaine de caractères comme argument:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE IMMEDIATE 'ALTER INDEX monIndex REBUILD ONLINE';
    Ceci dit, je continue de penser que ce n'est pas la vraie solution : il n'y a pas besoin de reconstruire l'index à chaque fois qu'on insère un enregistrement dans une table, et heureusement! Qu'est-ce que ça donnerai sur des tables volumineuses!

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2009
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 45
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par monalizzaa Voir le message
    DSl
    j'ai changé comme ça, mais ça n'a pas marché
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE OR REPLACE TRIGGER TRIGER11
    AFTER INSERT ON TABLE1
    FOR EACH ROW
    Begin
    EXEUTE IMMEDIATE INDEX monIndex REBUILD ONLINE;
    End;
    Mais il me signale tjrs Erreur syntaxique sur le mot "ALTER", comme si il n'accepte pas ça.
    Pour le COMMIT: je le fait aprés chaque insertion.
    Merci pour votre réponse
    voila l'origine de mon probleme:
    Via une interface web, Je faits des insertions dans la base en exécutant des requetes sql suivies par COMMIT.
    Quand je faits ma recherche via un formulaire web, il prends en charge seulement le 1er enregistrement, et le 2ème non.
    Mais quand j'entre sur mon SGBD (oracle) et je faits update à mon index, et je refaits ma recherche via le formulaire, il accede au 2eme enregistrement.
    C'est pourcela j'a pensé à un triger qui faits la maise à jour de mon index.
    Mais je saits pas si c la bonne solution ou pas..
    Merci de me débloquer

  10. #10
    Membre averti Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Points : 442
    Points
    442
    Par défaut
    Faites le test suivant:
    1. Connectez-vous à la base Oracle, avec SQL*Plus par exemple
    2. Connectez-vous avec votre appli web et faite une insertion
    3. Interrogez la base avec SQL*Plus pour voir si l'enregistrement est bien présent et le commit bien fait (SANS recalculer l'index)
    4. Recherchez avec votre appli web.

    Si à l'étape 3 vous ne voyez pas le nouvel enregistrement, c'est qu'il y a un problème dans votre procédure d'insertion et que le commit n'est pas fait.

    Par contre, si vous voyez le nouvel enregistrement à l'étape 3 mais pas à la 4, c'est qu'il y a un problème de rafraichissement des données dans votre appli web.

Discussions similaires

  1. Erreur sur champ text pour un index Full-Text
    Par Steph82 dans le forum Outils
    Réponses: 5
    Dernier message: 06/01/2011, 14h08
  2. TRIGGER pour des suppression en CASCADE
    Par softflower dans le forum Développement
    Réponses: 2
    Dernier message: 12/12/2005, 14h58
  3. petit conseil pour les index
    Par fpouget dans le forum Langage SQL
    Réponses: 11
    Dernier message: 10/12/2005, 04h39
  4. Trigger pour faire une table "mirroir"
    Par lgomez dans le forum Oracle
    Réponses: 8
    Dernier message: 26/10/2005, 13h12

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