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

 Oracle Discussion :

ORA-02292 : savoir quelle ligne pose problème (oracle 9.2.0.4.0)


Sujet :

Oracle

  1. #1
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut ORA-02292 : savoir quelle ligne pose problème (oracle 9.2.0.4.0)
    Bonjour à tous,

    voilà, j'ai un gros souci sur une requête qui fait un DELETE et qui est un tout petit peu complexe. Je me retrouve avec une violation de contrainte (ligne dans la table fille qui existe blahblah...). Pour la petite histoire, cette requête fonctionne bien "en général", mais je soupçonne que nous ayons un enregistrement (ou des données corrompues quelque part) qui ferait qu'elle plante lors d'une exécution particulière.

    Bref, pour le moment, je ne vais pas poster les tables/contraintes/requête complète... pour voir si vous avez des idées (ça viendra plus tard si on ne trouve rien ) par contre, je voudrais juste savoir si vous savez s'il est possible d'avoir plus d'infos sur ce genre de problème que la simple ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ERROR at line 2:
    ORA-02292: integrity constraint (BDD.TABLE1_TABLE2_FK) violated - child
    record found
    Du genre, quelle id pose problème, ... ?
    Evidemment, je préfèrerais une autre solution que de faire une requête avec un SELECT ID FROM... WHERE ID IN(<la requête qui pose problème et qui est loooooongue à tourner>) =]
    Du genre, en utilisant des tables systèmes ou autre d'Oracle ?

    Merci d'avance !

  2. #2
    Membre éclairé Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Points : 807
    Points
    807
    Par défaut
    le mieux serait de supprimer ta contrainte et de la recréer avec l'option on delete cascade

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    alter table nomtable ADD (
       CONSTRAINT nomcontrainte FOREIGN KEY (...) REFERENCES nomtable2 ( ... ) ON DELETE CASCADE
    );
    Mais attention tu peux remettre à la fin de ton traitement la contrainte originale pour prévenir de mauvaise manipulation utilisateur qui pourrais faire des delete.

  3. #3
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    oui mais non

    d'une part, je doute que le DBA de mon client me dise "OK, le script plante, on modifie la base "

    d'autre part, selon la requête, le problème ne devrait pas pouvoir se poser !

    donc le but est bien de trouver pourquoi on a ce souci (problème d'intégrité ?), et non de faire passer à tout prix le script

    pour info, la requête est "grosso modo" du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete from table1 where id in (select id from table2
                                    minus select id from table3);
    en sachant que la contrainte est entre les id de table2 et table3 et qu'il y a une contrainte en cascade entre table1 et table2 (mais globalement, table1 et table2 contiennent les mêmes lignes)

    donc il est difficile de purger une ligne de table1 qui serait dans table3 normalement (ie, si Oracle fait son boulot )

  4. #4
    Membre éclairé Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Points : 807
    Points
    807
    Par défaut
    Citation Envoyé par Alek-C Voir le message
    oui mais non

    d'une part, je doute que le DBA de mon client me dise "OK, le script plante, on modifie la base "

    d'autre part, selon la requête, le problème ne devrait pas pouvoir se poser !

    donc le but est bien de trouver pourquoi on a ce souci (problème d'intégrité ?), et non de faire passer à tout prix le script

    pour info, la requête est "grosso modo" du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete from table1 where id in (select id from table2
                                    minus select id from table3);
    en sachant que la contrainte est entre les id de table2 et table3 et qu'il y a une contrainte en cascade entre table1 et table2 (mais globalement, table1 et table2 contiennent les mêmes lignes)

    donc il est difficile de purger une ligne de table1 qui serait dans table3 normalement (ie, si Oracle fait son boulot )
    l'opérateur minus retourne les enregistrements présents dans table2 qui ne sont pas dans table3 et toi tu veux supprimer les enregistrements de table1 donc l'id est dans le résultat du minus. Mais comme tu le dis tu as une contrainte entre table1 et table2 donc tu ne pourras jamais supprimer les lignes que tu demandes.

    tu veux peut être faire le contraire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete from table1 where id in (select id from table3
                                    minus select id from table2);
    Si ce n'est pas cela, je n'ai vraiment pas compris ce que tu voulais faire.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2004
    Messages
    32
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Février 2004
    Messages : 32
    Points : 17
    Points
    17
    Par défaut
    Bonsoir,

    Tu peux peut etre passer par un curseur et un script PL avec gestion de l exception :

    begin
    for x in (select nanana)
    loop
    begin
    delete from table1 where tatata
    exception
    when other then
    IF sqlcode=-2292 then
    dbms_output.put_line(x.id);
    end;
    end loop;
    end;
    /

    Bon, je n'ai pas testé ca, c'est juste une idée à creuser.

    Chmanu

  6. #6
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Citation Envoyé par Z3phur Voir le message
    l'opérateur minus retourne les enregistrements présents dans table2 qui ne sont pas dans table3 et toi tu veux supprimer les enregistrements de table1 donc l'id est dans le résultat du minus. Mais comme tu le dis tu as une contrainte entre table1 et table2 donc tu ne pourras jamais supprimer les lignes que tu demandes.

    tu veux peut être faire le contraire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete from table1 where id in (select id from table3
                                    minus select id from table2);
    Si ce n'est pas cela, je n'ai vraiment pas compris ce que tu voulais faire.
    euh pas exactement, en fait, table1 et table2 contienne exactement les mêmes ids.

    Le but final est de purger table1 des enregistrements non présents dans table3 (et accessoirement, d'autres tables : il y a d'autres minus, mais ça ne change rien).

    Donc je commence à prendre tous les enregistrements de table2 qui n'existent pas dans table3 (via minus). Puis je supprime ces lignes de table1.

    Par ailleurs, il existe 2 contraintes (c'est là que tu as mal compris je pense: tu as du les inverser) :
    1. entre table1 et table2 qui est une contrainte en cascade (ie, je supprime une ligne de table1, elle disparait de table2),
    2. entre table3 et table2 (non cascadée) : je ne peux pas supprimer une ligne de table2 dont l'id est dans table3.

    Or, lors de l'exécution de ma requête, j'obtiens une erreur de violation de la contrainte numéro 2 qui, comme tu l'as indiqué et comme je le répète ci-dessus, ne devrait techniquement pas être violée puisque la requête est justement construite de façon à éviter ce problème :/
    En effet, me requête supprime de table1 toutes les ids de table2 qui ne sont pas présent dans table3. Or, la violation de contrainte ne pourrait à priori survenir que parce que j'essaye de supprimer une ligne de table1 (qui va être supprimée en cascade de table2) qui serait présente dans table3.

    Bon, je suis bien conscient que ce n'est pas facile à expliquer, mais comme je l'ai indiqué dans un précédent post, je doute très très fortement que le problème vienne de la requête.

    Et pour répondre à chmanu, c'est un peu compliqué: disons pour faire simple que, à moins que quelqu'un arrive à démontrer que cette manière de faire est erronée, je ne pourrais pas la modifier (on ne fait pas toujours ce qu'on veut au boulot...).
    D'où ma question initiale : est-il possible d'avoir plus d'information sur un problème d'intégrité référentielle ? (ne vous focaliser pas sur la requête =)

    merci encore

  7. #7
    Membre éclairé Avatar de Z3phur
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2007
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 680
    Points : 807
    Points
    807
    Par défaut
    Merci pour cet éclaircissement, je cerne mieux le problème.

    Dès que j'ai un début de solution je viens poster

  8. #8
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    pas de problème, merci à vous d'y penser ^^

Discussions similaires

  1. [Free Pascal] Comment savoir quelle ligne du programme est la cause d'une erreur à l'exécution
    Par NOVICE76 dans le forum Free Pascal
    Réponses: 5
    Dernier message: 04/09/2014, 21h46
  2. Savoir à quelle ligne d'un textfield apparaît un mot
    Par trucmuche2005 dans le forum ActionScript 3
    Réponses: 0
    Dernier message: 10/11/2010, 13h02
  3. Réponses: 1
    Dernier message: 27/05/2009, 21h16
  4. INSERT INTO SELECT quelle ligne pose problème
    Par cmako dans le forum Développement
    Réponses: 1
    Dernier message: 19/12/2008, 11h07
  5. Réponses: 5
    Dernier message: 02/03/2008, 19h47

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