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 :

[ORACLE 9i]Update sur champs avec contrainte


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Points : 13
    Points
    13
    Par défaut [ORACLE 9i]Update sur champs avec contrainte
    Bonjour,

    J'ai un petit probleme lié à une contrainte sur un champs. Etant pas un expert en sgbd, j'espere que vous pourriez m'aider

    Mon probleme est le suivant :

    Dans une base de données que je doit exploiter, un champs d'une table (table 1) est lié à un autre champs d'une autre table (table 2) par une contrainte. Je doit mettre à jour le champs de la table 1 mais celui-ci ne veut pas se mettre à jour à cause de cette contrainte.

    Voici pour information le script des tables ainsi que la contrainte :
    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
     
    create table ICS_APPLI_OR_ACTEUR  (
       APP_NOM              VARCHAR2(50)                    not null,
       APP_APAC_CODE        CHAR(1)                         not null,
       APP_MEGA_ID          VARCHAR2(20)                    not null,
       APP_DESCRIPTION      VARCHAR2(255),
       APP_TYPE             CHAR(1),
       constraint PK_ICS_APPLI_OR_ACTEUR primary key (APP_NOM, APP_APAC_CODE)
    );
     
    create table ICS_FLUX  (
       TFX_TYPE             CHAR(2)                         not null,
       FLX_NUM              CHAR(3)                         not null,
       EME_APP_NOM          VARCHAR2(50)                    not null,
       EME_APP_APAC_CODE    CHAR(1)                         not null,
       DEST_APP_NOM         VARCHAR2(50)                    not null,
       DEST_APP_APAC_CODE   CHAR(1)                         not null,
       ETF_ETA              VARCHAR2(1),
       FLX_NOM              VARCHAR2(40)                    not null,
       FLX_MEGA_ID          VARCHAR2(20)                    not null,
       FLX_DESCRIPTION      VARCHAR2(255),
       FLX_DT_MAJ           DATE,
       FLX_PRODUCTION       CHAR(1),
       FLX_SUPPRESSION		INTEGER,
       constraint PK_ICS_FLUX primary key (TFX_TYPE, FLX_NUM)
    );
     
    alter table ICS_FLUX
       add constraint FK_ICS_FLUX_DESTINATA_ICS_APPL foreign key (DEST_APP_NOM, DEST_APP_APAC_CODE)
          references ICS_APPLI_OR_ACTEUR (APP_NOM, APP_APAC_CODE);
     
    alter table ICS_FLUX
       add constraint FK_ICS_FLUX_EMETTEUR_ICS_APPL foreign key (EME_APP_NOM, EME_APP_APAC_CODE)
          references ICS_APPLI_OR_ACTEUR (APP_NOM, APP_APAC_CODE);
    Les 2 contraintes FK_ICS_FLUX_DESTINATA_ICS_APPL et FK_ICS_FLUX_EMETTEUR_ICS_APPL ont quasiment la meme fonctionnalité.

    Comment je pourrais mettre à jour le champs ICS_APPLI_OR_ACTEUR.APP_NOM sans avoir de probleme avec les contraintes ? Dois-je utiliser les cascades ? (je ne sais pas si cela existe sous oracle)

    Cela fonctionnerait si je mets un "on update cascade" sur les contraintes ?

    Merci pour vos réponses

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    non, il n'y a pas d'update cascade. Mais c'est la PK que tu veux modifier ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    A désolé, j'ai compètement oublier de dire quel champs je voulais modifier.

    Je voudrais faire un update sur le champs ICS_APPLI_OR_ACTEUR.APP_NOM mais dès que j'execute la requete, elle me retourne une erreur de contrainte vers la table ICS_FLUX (sur les champs DEST_APP_NOM ou EME_APP_NOM) donc c'est bien la contrainte qui m'embete et donc ma question est la suivante : comment je pourrais faire pour mettre a jour le champs ICS_APPLI_OR_ACTEUR.APP_NOM sans que la contrainte ne dérange et que cela fasse un effet de cascade sur la table flux?

    merci pour la réponse :-)

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    bah cherche pas, il est là le problème. Dans la modélisation il y a un soucis. La PK ne doit JAMAIS être modifiée. Pour régler le souci tu peux ajouter une colonne ID qui sera renseigné par un trigger et une séquence (recherche incrémentation auto) et c'est cette colonne qui sera ta PK.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    oui je sais, mais c'est pas moi qui a designer la base :-( , c'est mon chef de projet, je lui ai dis que c'etait moisi de mettre ce champs en primary key mais bon, tout le monde les connais, ils croient tous avoir la science infuse et forcement il m'a envoyé bouler.

    Merci pour ta réponse.

    Sinon ma copine propose quelque chose mais je trouve ca vraiment pas tres propre :

    Creer un nouvelle ligne dans ICS_APPLI_OR_ACTEUR avec le nouveau nom, mettre a jour la table ICS_FLUX avec ce nouveau nom et kicker l'ancienne ligne de la table ICS_APPLI_OR_ACTEUR

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    c'est pas mal mais tu risques fort d'avoir des problèmes de concurrence d'accés notamment des locks.

    Je pense qu'en expliquant bien le problème avec la PK comme ça et surtout en apportant une alternative, tu arriveras à convaincre ton chef... voir même... il sera content de ton boulot

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    Qu'entends tu par le problème de concurence ? Si quelqu'un essaye effectue un select sur la table en meme temps que l'on fait l'update ?

    Concernant la modification de la database, c'est pas la peine d'y penser car on doit livrer l'appli demain midi donc je ne pense pas avoir le temps de modifier toutes les procedures pour demain surtout qu'il faut que je finisse ce job d'update

  8. #8
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    tu n'as pas à modifier tes procédures. Tu as juste à livrer :
    - un alter de la table pour ajouter ID en NUMBER
    - une séquence
    - un trigger pour renseigner l'ID avec la valeur de la séquence
    - une PK sur l'ID
    - les FK vers ID

    c'est juste une solution technique, ça ne change en rien le fonctionnel

    Pour la concurrence d'accés, je pensais plutôt à 2 UPDATE qui passent en même temps... en plus c'est vraiment moche comme solution

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    ben merci beaucoup pour ta solution, je vais la proposer au chef

    bonne continuation et encore merci

  10. #10
    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
    Points : 4 926
    Points
    4 926
    Par défaut
    il existe aussi les contraintes DEFERRABLE

    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
     
    SQL> create table t1(x number primary key);
     
    Table created.
     
    SQL> create table t2(x number constraint fk references t1 deferrable);
     
    Table created.
     
    SQL> insert into t1 values (1);
     
    1 row created.
     
    SQL> insert into t2 values (1);
     
    1 row created.
     
    SQL> commit;
     
    Commit complete.
     
    SQL> update t1 set x=2;
    update t1 set x=2
    *
    ERROR at line 1:
    ORA-02292: integrity constraint (AUDBA.FK) violated - child record found
     
     
    SQL> set constraints fk deferred;
     
    Constraint set.
     
    SQL> update t1 set x=2;
     
    1 row updated.
     
    SQL> update t2 set x=2;
     
    1 row updated.
     
    SQL> commit;
     
    Commit complete.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Points : 13
    Points
    13
    Par défaut
    ouah merci, ca fonctionne du feu de dieu ton truc.

    Du coup j'ai tout qui s'update tranquillement

    Merci enormement a tout les 2

    ++

  12. #12
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Oui j'y avais pas pensé

    n'en reste pas moi qu'au niveau normalisation du modèle c'est horrible

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. update sur ligne avec doublon
    Par nicerico dans le forum Requêtes
    Réponses: 9
    Dernier message: 08/11/2008, 17h13
  2. Réponses: 9
    Dernier message: 21/08/2008, 17h07
  3. Réponses: 3
    Dernier message: 09/01/2008, 15h54
  4. [Update] sur champ vide
    Par userB dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 26/06/2007, 10h22
  5. jointure sur champ avec multiple valeur
    Par robert_trudel dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/05/2007, 17h40

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